Index: rlogind/rlogind.c =================================================================== RCS file: /sources/inetutils/inetutils/rlogind/rlogind.c,v retrieving revision 1.41 diff -u -p -r1.41 rlogind.c --- rlogind/rlogind.c 21 May 2008 04:48:59 -0000 1.41 +++ rlogind/rlogind.c 22 Aug 2008 13:06:27 -0000 @@ -66,7 +66,7 @@ #include #include #include -#include +#include #ifdef HAVE_SYS_SELECT_H # include #endif @@ -154,24 +154,6 @@ struct auth_data }; #endif -static const char *short_options = "aD::d::hk::L:lnp:orxV"; -static struct option long_options[] = { - {"allow-root", no_argument, 0, 'o'}, - {"verify-hostname", no_argument, 0, 'a'}, - {"daemon", optional_argument, 0, 'd'}, - {"no-rhosts", no_argument, 0, 'l'}, - {"no-keepalive", no_argument, 0, 'n'}, - {"local-domain", required_argument, 0, 'L'}, - {"kerberos", optional_argument, 0, 'k'}, - {"encrypt", no_argument, 0, 'x'}, - {"debug", optional_argument, 0, 'D'}, - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, - {"port", required_argument, 0, 'p'}, - {"reverse-required", no_argument, 0, 'r'}, - {0, 0, 0, 0} -}; - int allow_root = 0; int verify_hostname = 0; int keepalive = 1; @@ -196,7 +178,6 @@ int local_dot_count; struct winsize win = { 0, 0, 0, 0 }; -void usage (void); void rlogin_daemon (int maxchildren, int port); int rlogind_auth (int fd, struct auth_data *ap); void setup_tty (int fd, struct auth_data *ap); @@ -262,101 +243,134 @@ rlogind_sigchld (int sig) # define ENC_WRITE(c, fd, buf, size, ap) c = write (fd, buf, size) #endif +int maxchildren = DEFMAXCHILDREN; +int mode = MODE_INETD; +int port = 0; + char *program_name; -int -main (int argc, char *argv[]) -{ - int port = 0; - int maxchildren = DEFMAXCHILDREN; - int mode = MODE_INETD; - int c; +ARGP_PROGRAM_DATA ("rlogind", "2008", "FIXME unknown"); - program_name = argv[0]; - while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) - != EOF) - { - switch (c) - { - case 'a': - verify_hostname = 1; - break; - - case 'D': - if (optarg) - debug_level = strtoul (optarg, NULL, 10); - break; - - case 'd': - mode = MODE_DAEMON; - if (optarg) - maxchildren = strtoul (optarg, NULL, 10); - if (maxchildren == 0) - maxchildren = DEFMAXCHILDREN; - break; - - case 'l': - __check_rhosts_file = 0; /* FIXME: extern var? */ - break; - - case 'L': - local_domain_name = optarg; - break; - - case 'n': - keepalive = 0; - break; +const char args_doc[] = ""; +const char doc[] = "Remote terminal session server."; +static struct argp_option argp_options[] = { +#define GRP 0 + {"allow-root", 'o', NULL, 0, "Allow uid == 0 to login, disable by default", + GRP+1}, + {"verify-hostname", 'a', NULL, 0, "Ask hostname for verification", GRP+1}, + /* Added 'maxfork' for --daemon argument name */ + {"daemon", 'd', "MAXFORK", OPTION_ARG_OPTIONAL, "Daemon mode", GRP+1}, + {"no-rhosts", 'l', NULL, 0, "Ignore .rhosts file", GRP+1}, + {"no-keepalive", 'n', NULL, 0, "Do not set SO_KEEPALIVE", GRP+1}, + {"local-domain", 'L', "NAME", 0, "Set local domain name", GRP+1}, #if defined(KERBEROS) || defined(SHISHI) - case 'k': - if (optarg) - { - if (*optarg == '4') - kerberos = AUTH_KERBEROS_4; - else if (*optarg == '5') - kerberos = AUTH_KERBEROS_5; - } - else - kerberos = AUTH_KERBEROS_DEFAULT; - break; + {"kerberos", 'k', "NAME", OPTION_ARG_OPTIONAL, + "Use kerberos IV/V authentication", GRP+1}, +# ifdef ENCRYPTION + {"encrypt", 'x', NULL, 0, "Use DES encryption", GRP+1}, +# endif +#endif + {"debug", 'D', "LEVEL", OPTION_ARG_OPTIONAL, "Set debug level", GRP+1}, + {"port", 'p', "PORT", 0, "Listen on given port (valid only in daemon mode)", + GRP+1}, + {"reverse-required", 'r', NULL, 0, "Require reverse resolving of" + "a remote host IP", GRP+1}, +#undef GRP + {NULL} +}; + +static error_t +parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) + { + case 'a': + verify_hostname = 1; + break; + + case 'D': + if (arg) + debug_level = strtoul (arg, NULL, 10); + break; + + case 'd': + mode = MODE_DAEMON; + if (arg) + maxchildren = strtoul (arg, NULL, 10); + if (maxchildren == 0) + maxchildren = DEFMAXCHILDREN; + break; + + case 'l': + __check_rhosts_file = 0; /* FIXME: extern var? */ + break; + + case 'L': + local_domain_name = arg; + break; + + case 'n': + keepalive = 0; + break; + +#if defined(KERBEROS) || defined(SHISHI) + case 'k': + if (arg) + { + if (*arg == '4') + kerberos = AUTH_KERBEROS_4; + else if (*arg == '5') + kerberos = AUTH_KERBEROS_5; + } + else + kerberos = AUTH_KERBEROS_DEFAULT; + break; # ifdef ENCRYPTION - case 'x': - encrypt_io = 1; - break; + case 'x': + encrypt_io = 1; + break; # endif /* ENCRYPTION */ #endif /* KERBEROS */ - case 'o': - allow_root = 1; - break; - - case 'p': - port = strtoul (optarg, NULL, 10); - break; - - case 'r': - reverse_required = 1; - break; - - case 'V': - printf ("rlogind (%s %s)\n", PACKAGE_NAME, PACKAGE_VERSION); - exit (0); - - case 'h': - default: - usage (); - exit (0); - } - } + case 'o': + allow_root = 1; + break; + + case 'p': + port = strtoul (arg, NULL, 10); + break; + + case 'r': + reverse_required = 1; + break; + + case ARGP_KEY_ARG: + argp_usage (state); + + default: + ARGP_ERR_UNKNOWN; + } + + return 0; +} + +static struct argp argp = {argp_options, parse_opt, args_doc, doc}; + +int +main (int argc, char *argv[]) +{ + int index; + + program_name = argv[0]; + + /* Parse command line */ + argp_parse (&argp, argc, argv, 0, &index, NULL); openlog ("rlogind", LOG_PID | LOG_CONS, LOG_AUTH); - argc -= optind; - if (argc > 0) - { + argc -= index; syslog (LOG_ERR, "%d extra arguments", argc); - exit (1); - } signal (SIGHUP, SIG_IGN); @@ -1518,31 +1532,3 @@ fatal (int f, const char *msg, int syser write (f, buf, bp + len - buf); exit (1); } - -static const char usage_str[] = - "usage: rlogind [options]\n" - "\n" - "Options are:\n" - " -a, --verify-hostname Ask hostname for verification\n" - " -d, --daemon Daemon mode\n" - " -l, --no-rhosts Ignore .rhosts file\n" - " -L, --local-domain=NAME Set local domain name\n" - " -n, --no-keepalive Do not set SO_KEEPALIVE\n" -#if defined(KERBEROS) || defined(SHISHI) - " -k, --kerberos Use kerberos IV/V authentication\n" -# ifdef ENCRYPTION - " -x, --encrypt Use DES encryption\n" -# endif /* ENCRYPTION */ -#endif /* KERBEROS */ - " -D, --debug[=LEVEL] Set debug level\n" - " -h, --help Display usage instructions\n" - " -V, --version Display program version\n" - " -o, --allow-root Allow uid == 0 to login, disable by default\n" - " -p, --port PORT Listen on given port (valid only in daemon mode)\n" - " -r, --reverse-required Require reverse resolving of a remote host IP\n"; - -void -usage () -{ - printf ("%s\n" "Send bug reports to %s\n", usage_str, PACKAGE_BUGREPORT); -}