1  /*
       2   * line - read one line
       3   *
       4   * Gunnar Ritter, Freiburg i. Br., Germany, December 2000.
       5   *
       6   * Public Domain.
       7   */
       8  
       9  /*
      10   * This command is deprecated.  The utility is in maintenance mode,
      11   * meaning we keep them in source tree for backward compatibility
      12   * only.  Do not waste time making this command better, unless the
      13   * fix is about security or other very critical issue.
      14   *
      15   * See Documentation/deprecated.txt for more information.
      16   */
      17  
      18  #include <getopt.h>
      19  #include <stdio.h>
      20  #include <unistd.h>
      21  
      22  #include "c.h"
      23  #include "closestream.h"
      24  #include "nls.h"
      25  #include "widechar.h"
      26  
      27  static void __attribute__((__noreturn__)) usage(void)
      28  {
      29  	FILE *out = stdout;
      30  	fputs(USAGE_HEADER, out);
      31  	fprintf(out, _(" %s [options]\n"), program_invocation_short_name);
      32  
      33  	fputs(USAGE_SEPARATOR, out);
      34  	fputs(_("Read one line.\n"), out);
      35  
      36  	fputs(USAGE_OPTIONS, out);
      37  	printf(USAGE_HELP_OPTIONS(16));
      38  	printf(USAGE_MAN_TAIL("line(1)"));
      39  	exit(EXIT_SUCCESS);
      40  }
      41  
      42  int main(int argc, char **argv)
      43  {
      44  	wint_t c;
      45  	int opt;
      46  	int status = EXIT_SUCCESS;
      47  
      48  	static const struct option longopts[] = {
      49  		{"version", no_argument, NULL, 'V'},
      50  		{"help", no_argument, NULL, 'h'},
      51  		{NULL, 0, NULL, 0}
      52  	};
      53  
      54  	setlocale(LC_ALL, "");
      55  	bindtextdomain(PACKAGE, LOCALEDIR);
      56  	textdomain(PACKAGE);
      57  	close_stdout_atexit();
      58  
      59  	while ((opt = getopt_long(argc, argv, "Vh", longopts, NULL)) != -1)
      60  		switch (opt) {
      61  		case 'V':
      62  			print_version(EXIT_SUCCESS);
      63  		case 'h':
      64  			usage();
      65  		default:
      66  			errtryhelp(EXIT_FAILURE);
      67  		}
      68  
      69  	setvbuf(stdin, NULL, _IONBF, 0);
      70  	for (;;) {
      71  		c = getwchar();
      72  		if (c == WEOF) {
      73  			status = EXIT_FAILURE;
      74  			break;
      75  		}
      76  		if (c == '\n')
      77  			break;
      78  		putwchar(c);
      79  	}
      80  	putwchar(L'\n');
      81  
      82  	return status;
      83  }