Re: [PATCH 1/3] Change isatty's parameter to a *_FILENO define

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Avishay Matayev <me@xxxxxxxxxxx> writes:

> This isn't a functional change.

This does not seem to make the code any easier to follow, though.
Is this amount of code churn really needed?

>
> The next patch in this series will rename all isatty calls anyway so I
> figured it is a good time to change the same calls to consistently use
> STD[IN|OUT|ERR]_FILENO.
>
> Signed-off-by: Avishay Matayev <me@xxxxxxxxxxx>
> ---
>  builtin/am.c               | 2 +-
>  builtin/bisect--helper.c   | 2 +-
>  builtin/blame.c            | 2 +-
>  builtin/checkout.c         | 2 +-
>  builtin/commit-graph.c     | 4 ++--
>  builtin/commit.c           | 2 +-
>  builtin/fsck.c             | 2 +-
>  builtin/gc.c               | 2 +-
>  builtin/log.c              | 2 +-
>  builtin/merge.c            | 4 ++--
>  builtin/multi-pack-index.c | 2 +-
>  builtin/pack-objects.c     | 2 +-
>  builtin/pack-redundant.c   | 2 +-
>  builtin/prune-packed.c     | 2 +-
>  builtin/prune.c            | 2 +-
>  builtin/rebase.c           | 2 +-
>  builtin/repack.c           | 2 +-
>  builtin/send-pack.c        | 2 +-
>  builtin/shortlog.c         | 4 ++--
>  builtin/sparse-checkout.c  | 2 +-
>  builtin/unpack-objects.c   | 2 +-
>  column.c                   | 2 +-
>  date.c                     | 2 +-
>  editor.c                   | 2 +-
>  pager.c                    | 4 ++--
>  preload-index.c            | 2 +-
>  read-cache.c               | 2 +-
>  remote-curl.c              | 2 +-
>  sequencer.c                | 4 ++--
>  sideband.c                 | 2 +-
>  transport.c                | 6 +++---
>  transport.h                | 2 +-
>  32 files changed, 39 insertions(+), 39 deletions(-)
>
> diff --git a/builtin/am.c b/builtin/am.c
> index 0b2d886c81..2230c3e94d 100644
> --- a/builtin/am.c
> +++ b/builtin/am.c
> @@ -2394,7 +2394,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
>  		 *    intend to feed us a patch but wanted to continue
>  		 *    unattended.
>  		 */
> -		if (argc || (resume.mode == RESUME_FALSE && !isatty(0)))
> +		if (argc || (resume.mode == RESUME_FALSE && !isatty(STDIN_FILENO)))
>  			die(_("previous rebase directory %s still exists but mbox given."),
>  				state.dir);
>  
> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
> index 9d9540a0ab..5d42c75a46 100644
> --- a/builtin/bisect--helper.c
> +++ b/builtin/bisect--helper.c
> @@ -346,7 +346,7 @@ static int decide_next(const struct bisect_terms *terms,
>  		 * although this is less optimum.
>  		 */
>  		warning(_("bisecting only with a %s commit"), terms->term_bad);
> -		if (!isatty(0))
> +		if (!isatty(STDIN_FILENO))
>  			return 0;
>  		/*
>  		 * TRANSLATORS: Make sure to include [Y] and [n] in your
> diff --git a/builtin/blame.c b/builtin/blame.c
> index 641523ff9a..1b674b2f52 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -945,7 +945,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
>  			die(_("--progress can't be used with --incremental or porcelain formats"));
>  		show_progress = 0;
>  	} else if (show_progress < 0)
> -		show_progress = isatty(2);
> +		show_progress = isatty(STDERR_FILENO);
>  
>  	if (0 < abbrev && abbrev < hexsz)
>  		/* one more abbrev length is needed for the boundary commit */
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index f4cd7747d3..e3bd31449b 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -1607,7 +1607,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>  		if (opts->quiet)
>  			opts->show_progress = 0;
>  		else
> -			opts->show_progress = isatty(2);
> +			opts->show_progress = isatty(STDERR_FILENO);
>  	}
>  
>  	if (opts->conflict_style) {
> diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
> index cd86315221..461f1a2a65 100644
> --- a/builtin/commit-graph.c
> +++ b/builtin/commit-graph.c
> @@ -87,7 +87,7 @@ static int graph_verify(int argc, const char **argv)
>  
>  	trace2_cmd_mode("verify");
>  
> -	opts.progress = isatty(2);
> +	opts.progress = isatty(STDERR_FILENO);
>  	argc = parse_options(argc, argv, NULL,
>  			     builtin_commit_graph_verify_options,
>  			     builtin_commit_graph_verify_usage, 0);
> @@ -236,7 +236,7 @@ static int graph_write(int argc, const char **argv)
>  		OPT_END(),
>  	};
>  
> -	opts.progress = isatty(2);
> +	opts.progress = isatty(STDERR_FILENO);
>  	opts.enable_changed_paths = -1;
>  	write_opts.size_multiple = 2;
>  	write_opts.max_commits = 0;
> diff --git a/builtin/commit.c b/builtin/commit.c
> index 190d215d43..d364ce6a39 100644
> --- a/builtin/commit.c
> +++ b/builtin/commit.c
> @@ -754,7 +754,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
>  		strbuf_addbuf(&sb, &message);
>  		hook_arg1 = "message";
>  	} else if (logfile && !strcmp(logfile, "-")) {
> -		if (isatty(0))
> +		if (isatty(STDIN_FILENO))
>  			fprintf(stderr, _("(reading log message from standard input)\n"));
>  		if (strbuf_read(&sb, 0, 0) < 0)
>  			die_errno(_("could not read log from standard input"));
> diff --git a/builtin/fsck.c b/builtin/fsck.c
> index b42b6fe21f..4e65c823e4 100644
> --- a/builtin/fsck.c
> +++ b/builtin/fsck.c
> @@ -790,7 +790,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
>  		fsck_obj_options.strict = 1;
>  
>  	if (show_progress == -1)
> -		show_progress = isatty(2);
> +		show_progress = isatty(STDERR_FILENO);
>  	if (verbose)
>  		show_progress = 0;
>  
> diff --git a/builtin/gc.c b/builtin/gc.c
> index f05d2f0a1a..4566754427 100644
> --- a/builtin/gc.c
> +++ b/builtin/gc.c
> @@ -1425,7 +1425,7 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
>  	};
>  	memset(&opts, 0, sizeof(opts));
>  
> -	opts.quiet = !isatty(2);
> +	opts.quiet = !isatty(STDERR_FILENO);
>  
>  	for (i = 0; i < TASK__COUNT; i++)
>  		tasks[i].selected_order = -1;
> diff --git a/builtin/log.c b/builtin/log.c
> index 6102893fcc..5bb9f4194a 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -69,7 +69,7 @@ struct line_opt_callback_data {
>  
>  static int session_is_interactive(void)
>  {
> -	return isatty(1) || pager_in_use();
> +	return isatty(STDOUT_FILENO) || pager_in_use();
>  }
>  
>  static int auto_decoration_style(void)
> diff --git a/builtin/merge.c b/builtin/merge.c
> index a8a843b1f5..88f53c03b5 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -734,7 +734,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
>  			o.subtree_shift = "";
>  
>  		o.show_rename_progress =
> -			show_progress == -1 ? isatty(2) : show_progress;
> +			show_progress == -1 ? isatty(STDERR_FILENO) : show_progress;
>  
>  		for (x = 0; x < xopts_nr; x++)
>  			if (parse_merge_opt(&o, xopts[x]))
> @@ -1073,7 +1073,7 @@ static int default_edit_option(void)
>  	/* Use editor if stdin and stdout are the same and is a tty */
>  	return (!fstat(0, &st_stdin) &&
>  		!fstat(1, &st_stdout) &&
> -		isatty(0) && isatty(1) &&
> +		isatty(STDIN_FILENO) && isatty(STDOUT_FILENO) &&
>  		st_stdin.st_dev == st_stdout.st_dev &&
>  		st_stdin.st_ino == st_stdout.st_ino &&
>  		st_stdin.st_mode == st_stdout.st_mode);
> diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c
> index 5d3ea445fd..8e329b8b22 100644
> --- a/builtin/multi-pack-index.c
> +++ b/builtin/multi-pack-index.c
> @@ -154,7 +154,7 @@ int cmd_multi_pack_index(int argc, const char **argv,
>  
>  	git_config(git_default_config, NULL);
>  
> -	if (isatty(2))
> +	if (isatty(STDERR_FILENO))
>  		opts.flags |= MIDX_PROGRESS;
>  	argc = parse_options(argc, argv, prefix,
>  			     builtin_multi_pack_index_options,
> diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
> index de00adbb9e..74536fa5a4 100644
> --- a/builtin/pack-objects.c
> +++ b/builtin/pack-objects.c
> @@ -4016,7 +4016,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
>  	if (git_env_bool(GIT_TEST_WRITE_REV_INDEX, 0))
>  		pack_idx_opts.flags |= WRITE_REV;
>  
> -	progress = isatty(2);
> +	progress = isatty(STDERR_FILENO);
>  	argc = parse_options(argc, argv, prefix, pack_objects_options,
>  			     pack_usage, 0);
>  
> diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
> index 8bf5c0acad..acf1edba3a 100644
> --- a/builtin/pack-redundant.c
> +++ b/builtin/pack-redundant.c
> @@ -621,7 +621,7 @@ int cmd_pack_redundant(int argc, const char **argv, const char *prefix)
>  
>  	/* ignore objects given on stdin */
>  	llist_init(&ignore);
> -	if (!isatty(0)) {
> +	if (!isatty(STDIN_FILENO)) {
>  		while (fgets(buf, sizeof(buf), stdin)) {
>  			oid = xmalloc(sizeof(*oid));
>  			if (get_oid_hex(buf, oid))
> diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
> index b7b9281a8c..5d476316a5 100644
> --- a/builtin/prune-packed.c
> +++ b/builtin/prune-packed.c
> @@ -9,7 +9,7 @@ static const char * const prune_packed_usage[] = {
>  
>  int cmd_prune_packed(int argc, const char **argv, const char *prefix)
>  {
> -	int opts = isatty(2) ? PRUNE_PACKED_VERBOSE : 0;
> +	int opts = isatty(STDERR_FILENO) ? PRUNE_PACKED_VERBOSE : 0;
>  	const struct option prune_packed_options[] = {
>  		OPT_BIT('n', "dry-run", &opts, N_("dry run"),
>  			PRUNE_PACKED_DRY_RUN),
> diff --git a/builtin/prune.c b/builtin/prune.c
> index 02c6ab7cba..36b9fed1bf 100644
> --- a/builtin/prune.c
> +++ b/builtin/prune.c
> @@ -165,7 +165,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
>  	}
>  
>  	if (show_progress == -1)
> -		show_progress = isatty(2);
> +		show_progress = isatty(STDERR_FILENO);
>  	if (exclude_promisor_objects) {
>  		fetch_if_missing = 0;
>  		revs.exclude_promisor_objects = 1;
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> index 12f093121d..97e8c8cbf8 100644
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@ -1745,7 +1745,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
>  	if (options.root && !options.onto_name)
>  		imply_merge(&options, "--root without --onto");
>  
> -	if (isatty(2) && options.flags & REBASE_NO_QUIET)
> +	if (isatty(STDERR_FILENO) && options.flags & REBASE_NO_QUIET)
>  		strbuf_addstr(&options.git_format_patch_opt, " --progress");
>  
>  	if (options.git_am_opts.nr || options.type == REBASE_APPLY) {
> diff --git a/builtin/repack.c b/builtin/repack.c
> index 5f9bc74adc..4eb21e8e98 100644
> --- a/builtin/repack.c
> +++ b/builtin/repack.c
> @@ -710,7 +710,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
>  			}
>  			strbuf_release(&buf);
>  		}
> -		if (!po_args.quiet && isatty(2))
> +		if (!po_args.quiet && isatty(STDERR_FILENO))
>  			opts |= PRUNE_PACKED_VERBOSE;
>  		prune_packed_objects(opts);
>  
> diff --git a/builtin/send-pack.c b/builtin/send-pack.c
> index a7e01667b0..c168c03a26 100644
> --- a/builtin/send-pack.c
> +++ b/builtin/send-pack.c
> @@ -261,7 +261,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
>  	}
>  
>  	if (progress == -1)
> -		progress = !args.quiet && isatty(2);
> +		progress = !args.quiet && isatty(STDERR_FILENO);
>  	args.progress = progress;
>  
>  	if (args.stateless_rpc) {
> diff --git a/builtin/shortlog.c b/builtin/shortlog.c
> index 3e7ab1ca82..a3612e3f72 100644
> --- a/builtin/shortlog.c
> +++ b/builtin/shortlog.c
> @@ -406,10 +406,10 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)
>  	string_list_sort(&log.trailers);
>  
>  	/* assume HEAD if from a tty */
> -	if (!nongit && !rev.pending.nr && isatty(0))
> +	if (!nongit && !rev.pending.nr && isatty(STDIN_FILENO))
>  		add_head_to_pending(&rev);
>  	if (rev.pending.nr == 0) {
> -		if (isatty(0))
> +		if (isatty(STDIN_FILENO))
>  			fprintf(stderr, _("(reading log message from standard input)\n"));
>  		read_from_stdin(&log);
>  	}
> diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
> index a4bdd7c494..63e79c7520 100644
> --- a/builtin/sparse-checkout.c
> +++ b/builtin/sparse-checkout.c
> @@ -114,7 +114,7 @@ static int update_working_directory(struct pattern_list *pl)
>  	r->index->sparse_checkout_patterns = pl;
>  
>  	memset(&o, 0, sizeof(o));
> -	o.verbose_update = isatty(2);
> +	o.verbose_update = isatty(STDERR_FILENO);
>  	o.update = 1;
>  	o.head_idx = -1;
>  	o.src_index = r->index;
> diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
> index 4a9466295b..1a86e2e606 100644
> --- a/builtin/unpack-objects.c
> +++ b/builtin/unpack-objects.c
> @@ -522,7 +522,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
>  
>  	git_config(git_default_config, NULL);
>  
> -	quiet = !isatty(2);
> +	quiet = !isatty(STDERR_FILENO);
>  
>  	for (i = 1 ; i < argc; i++) {
>  		const char *arg = argv[i];
> diff --git a/column.c b/column.c
> index 1261e18a72..375869e848 100644
> --- a/column.c
> +++ b/column.c
> @@ -211,7 +211,7 @@ int finalize_colopts(unsigned int *colopts, int stdout_is_tty)
>  {
>  	if ((*colopts & COL_ENABLE_MASK) == COL_AUTO) {
>  		if (stdout_is_tty < 0)
> -			stdout_is_tty = isatty(1);
> +			stdout_is_tty = isatty(STDOUT_FILENO);
>  		*colopts &= ~COL_ENABLE_MASK;
>  		if (stdout_is_tty || pager_in_use())
>  			*colopts |= COL_ENABLED;
> diff --git a/date.c b/date.c
> index f9ea807b3a..6dd6c37c22 100644
> --- a/date.c
> +++ b/date.c
> @@ -969,7 +969,7 @@ void parse_date_format(const char *format, struct date_mode *mode)
>  
>  	/* "auto:foo" is "if tty/pager, then foo, otherwise normal" */
>  	if (skip_prefix(format, "auto:", &p)) {
> -		if (isatty(1) || pager_in_use())
> +		if (isatty(STDOUT_FILENO) || pager_in_use())
>  			format = p;
>  		else
>  			format = "default";
> diff --git a/editor.c b/editor.c
> index 6303ae0ab0..13521f05cf 100644
> --- a/editor.c
> +++ b/editor.c
> @@ -58,7 +58,7 @@ static int launch_specified_editor(const char *editor, const char *path,
>  		const char *args[] = { editor, NULL, NULL };
>  		struct child_process p = CHILD_PROCESS_INIT;
>  		int ret, sig;
> -		int print_waiting_for_editor = advice_waiting_for_editor && isatty(2);
> +		int print_waiting_for_editor = advice_waiting_for_editor && isatty(STDERR_FILENO);
>  
>  		if (print_waiting_for_editor) {
>  			/*
> diff --git a/pager.c b/pager.c
> index 3d37dd7ada..3c4664ebed 100644
> --- a/pager.c
> +++ b/pager.c
> @@ -101,7 +101,7 @@ void prepare_pager_args(struct child_process *pager_process, const char *pager)
>  
>  void setup_pager(void)
>  {
> -	const char *pager = git_pager(isatty(1));
> +	const char *pager = git_pager(isatty(STDOUT_FILENO));
>  
>  	if (!pager)
>  		return;
> @@ -128,7 +128,7 @@ void setup_pager(void)
>  
>  	/* original process continues, but writes to the pipe */
>  	dup2(pager_process.in, 1);
> -	if (isatty(2))
> +	if (isatty(STDERR_FILENO))
>  		dup2(pager_process.in, 2);
>  	close(pager_process.in);
>  
> diff --git a/preload-index.c b/preload-index.c
> index e5529a5863..28707d9bee 100644
> --- a/preload-index.c
> +++ b/preload-index.c
> @@ -121,7 +121,7 @@ void preload_index(struct index_state *index,
>  	memset(&data, 0, sizeof(data));
>  
>  	memset(&pd, 0, sizeof(pd));
> -	if (refresh_flags & REFRESH_PROGRESS && isatty(2)) {
> +	if (refresh_flags & REFRESH_PROGRESS && isatty(STDERR_FILENO)) {
>  		pd.progress = start_delayed_progress(_("Refreshing index"), index->cache_nr);
>  		pthread_mutex_init(&pd.mutex, NULL);
>  	}
> diff --git a/read-cache.c b/read-cache.c
> index 77961a3885..a8063fefe6 100644
> --- a/read-cache.c
> +++ b/read-cache.c
> @@ -1568,7 +1568,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
>  	int t2_sum_lstat = 0;
>  	int t2_sum_scan = 0;
>  
> -	if (flags & REFRESH_PROGRESS && isatty(2))
> +	if (flags & REFRESH_PROGRESS && isatty(STDERR_FILENO))
>  		progress = start_delayed_progress(_("Refresh index"),
>  						  istate->cache_nr);
>  
> diff --git a/remote-curl.c b/remote-curl.c
> index 9d432c299a..843a287680 100644
> --- a/remote-curl.c
> +++ b/remote-curl.c
> @@ -1483,7 +1483,7 @@ int cmd_main(int argc, const char **argv)
>  	}
>  
>  	options.verbosity = 1;
> -	options.progress = !!isatty(2);
> +	options.progress = !!isatty(STDERR_FILENO);
>  	options.thin = 1;
>  	string_list_init(&options.deepen_not, 1);
>  	string_list_init(&options.push_options, 1);
> diff --git a/sequencer.c b/sequencer.c
> index 0bec01cf38..d1311eecc1 100644
> --- a/sequencer.c
> +++ b/sequencer.c
> @@ -2040,7 +2040,7 @@ static int should_edit(struct replay_opts *opts) {
>  		 * commits; continue_single_pick() handles the conflicted
>  		 * commits itself instead of calling this function.
>  		 */
> -		return (opts->action == REPLAY_REVERT && isatty(0)) ? 1 : 0;
> +		return (opts->action == REPLAY_REVERT && isatty(STDIN_FILENO)) ? 1 : 0;
>  	return opts->edit;
>  }
>  
> @@ -4589,7 +4589,7 @@ static int continue_single_pick(struct repository *r, struct replay_opts *opts)
>  	 * we want to edit if the user asked for it, or if they didn't specify
>  	 * and stdin is a tty.
>  	 */
> -	if (!opts->edit || (opts->edit < 0 && !isatty(0)))
> +	if (!opts->edit || (opts->edit < 0 && !isatty(STDIN_FILENO)))
>  		/*
>  		 * Include --cleanup=strip as well because we don't want the
>  		 * "# Conflicts:" messages.
> diff --git a/sideband.c b/sideband.c
> index 6f9e026732..a5dcb971f5 100644
> --- a/sideband.c
> +++ b/sideband.c
> @@ -126,7 +126,7 @@ int demultiplex_sideband(const char *me, int status,
>  	int band;
>  
>  	if (!suffix) {
> -		if (isatty(2) && !is_terminal_dumb())
> +		if (isatty(STDERR_FILENO) && !is_terminal_dumb())
>  			suffix = ANSI_SUFFIX;
>  		else
>  			suffix = DUMB_SUFFIX;
> diff --git a/transport.c b/transport.c
> index 50f5830eb6..ab8f297afa 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -1051,7 +1051,7 @@ struct transport *transport_get(struct remote *remote, const char *url)
>  	const char *helper;
>  	struct transport *ret = xcalloc(1, sizeof(*ret));
>  
> -	ret->progress = isatty(2);
> +	ret->progress = isatty(STDERR_FILENO);
>  	string_list_init(&ret->pack_lockfiles, 1);
>  
>  	if (!remote)
> @@ -1168,12 +1168,12 @@ void transport_set_verbosity(struct transport *transport, int verbosity,
>  	 *   . Report progress, if force_progress is 1 (ie. --progress).
>  	 *   . Don't report progress, if force_progress is 0 (ie. --no-progress).
>  	 *   . Don't report progress, if verbosity < 0 (ie. -q/--quiet ).
> -	 *   . Report progress if isatty(2) is 1.
> +	 *   . Report progress if isatty(STDERR_FILENO) is 1.
>  	 **/
>  	if (force_progress >= 0)
>  		transport->progress = !!force_progress;
>  	else
> -		transport->progress = verbosity >= 0 && isatty(2);
> +		transport->progress = verbosity >= 0 && isatty(STDERR_FILENO);
>  }
>  
>  static void die_with_unpushed_submodules(struct string_list *needs_pushing)
> diff --git a/transport.h b/transport.h
> index 1cbab11373..4630d42755 100644
> --- a/transport.h
> +++ b/transport.h
> @@ -110,7 +110,7 @@ struct transport {
>  	signed verbose : 3;
>  	/**
>  	 * Transports should not set this directly, and should use this
> -	 * value without having to check isatty(2), -q/--quiet
> +	 * value without having to check isatty(STDERR_FILENO), -q/--quiet
>  	 * (transport->verbose < 0), etc. - checking has already been done
>  	 * in transport_set_verbosity().
>  	 **/



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux