On Fri, Feb 08, 2002 at 07:03:02PM +0100, Marcus Brinkmann wrote: > here is a fix on top of the other patch
and here a patch on top of the patch on top of the patch. The whole patch is now available at ftp://alpha.gnu.org/gnu/hurd/contrib/marcus/term.diff This patch adds argp parsing to term, and cleans up a bit of other cruft. I know I should supply individual patches for different things, but I am now so out of sync that I won't bother. I think it is easier to just be selective in the final version (if you tell me some things can go in and others not [yet], I will comply). Thanks, Marcus diff -ru term.new/ChangeLog term.new2/ChangeLog --- term.new/ChangeLog Fri Feb 8 19:02:21 2002 +++ term.new2/ChangeLog Fri Feb 8 21:30:54 2002 @@ -1,6 +1,17 @@ 2002-02-08 Marcus Brinkmann <[EMAIL PROTECTED]> - * term.h (struct bottomhalf): Add new member init(). + * main.c: Include `argp.h' and `version.h'. + (argp_program_version): New global variable. + (tty_name, tty_type, tty_arg): Likewise. + (parse_opt): New function. + (term_argp): New global variable. + (main): Call argp_parse, use new global variables to parse the + options. Remove TYPE variable. + +2002-02-08 Marcus Brinkmann <[EMAIL PROTECTED]> + + * term.h (struct bottomhalf): Add new member init(). Remove + prototype for ptyio_init. * main.c (main): Initialize bottom handler (rather than special casing this for ptyio). * ptyio.c (ptyio_init): Change return type to error_t and return diff -ru term.new/devio.c term.new2/devio.c --- term.new/devio.c Fri Feb 8 19:26:22 2002 +++ term.new2/devio.c Fri Feb 8 21:12:02 2002 @@ -1,5 +1,5 @@ /* - Copyright (C) 1995,96,98,99,2000,01 Free Software Foundation, Inc. + Copyright (C) 1995,96,98,99,2000,01,02 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. diff -ru term.new/main.c term.new2/main.c --- term.new/main.c Fri Feb 8 19:06:05 2002 +++ term.new2/main.c Fri Feb 8 21:59:11 2002 @@ -1,5 +1,5 @@ /* - Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 2000, 2002 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. @@ -23,17 +23,27 @@ #include <fcntl.h> #include <hurd/trivfs.h> #include <stdio.h> +#include <argp.h> #include <hurd/fsys.h> #include <string.h> +#include <version.h> + +const char *argp_program_version = STANDARD_HURD_VERSION (term); + int trivfs_fstype = FSTYPE_TERM; -int trivfs_fsid = 0; /* pid?? */ +int trivfs_fsid = 0; int trivfs_support_read = 1; int trivfs_support_write = 1; int trivfs_support_exec = 0; int trivfs_allow_open = O_READ|O_WRITE; +/* The argument line options. */ +char *tty_name; +enum { T_NONE = 0, T_DEVICE, T_HURDIO, T_PTYMASTER, T_PTYSLAVE } tty_type; +char *tty_arg; + int demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp) { @@ -47,6 +57,58 @@ || device_reply_server (inp, outp)); } + +static error_t +parse_opt (int opt, char *arg, struct argp_state *state) +{ + switch (opt) + { + default: + return ARGP_ERR_UNKNOWN; + case ARGP_KEY_INIT: + case ARGP_KEY_SUCCESS: + case ARGP_KEY_ERROR: + break; + case ARGP_KEY_ARG: + if (!tty_name) + tty_name = arg; + else if (!tty_type) + { + if (!strcmp (arg, "device")) + tty_type = T_DEVICE; + else if (!strcmp (arg, "hurdio")) + tty_type = T_HURDIO; + else if (!strcmp (arg, "pty-master")) + tty_type = T_PTYMASTER; + else if (!strcmp (arg, "pty-slave")) + tty_type = T_PTYSLAVE; + else + argp_error (state, "Invalid terminal type"); + } + else if (!tty_arg) + tty_arg = arg; + else + argp_error (state, "Too many arguments"); + break; + case ARGP_KEY_END: + if (!tty_name || !tty_type || !tty_arg) + argp_error (state, "Too few arguments"); + break; + } + return 0; +} + +static struct argp term_argp = + { 0, parse_opt, "NAME TYPE ARG", "A translator that emulates a terminal.\v"\ + "Possible values for TYPE:\n"\ + " device Use Mach device ARG as bottom handler.\n"\ + " hurdio Use file port ARG as bottom handler.\n"\ + " pty-master Master for slave at ARG.\n"\ + " pty-slave Slave for master at ARG.\n"\ + "\n"\ + "The filename of the node that the translator is attached to should be\n"\ + "supplied in NAME.\n" }; + int main (int argc, char **argv) { @@ -54,7 +116,6 @@ struct port_class *peerclass, *peercntlclass; struct trivfs_control **ourcntl, **peercntl; mach_port_t bootstrap, right; - enum {T_DEVICE, T_PTYMASTER, T_PTYSLAVE} type; struct stat st; term_bucket = ports_create_bucket (); @@ -68,15 +129,11 @@ init_users (); - if (argc != 4) - { - fprintf (stderr, "Usage: term ttyname type arg\n"); - exit (1); - } + argp_parse (&term_argp, argc, argv, 0, 0, 0); - if (!strcmp (argv[2], "device")) + switch (tty_type) { - type = T_DEVICE; + case T_DEVICE: bottom = &devio_bottom; ourclass = tty_class; ourcntlclass = tty_cntl_class; @@ -84,11 +141,10 @@ peerclass = 0; peercntlclass = 0; peercntl = 0; - pterm_name = argv[3]; - } - if (!strcmp (argv[2], "hurdio")) - { - type = T_DEVICE; + pterm_name = tty_arg; + break; + + case T_HURDIO: bottom = &hurdio_bottom; ourclass = tty_class; ourcntlclass = tty_cntl_class; @@ -96,11 +152,10 @@ peerclass = 0; peercntlclass = 0; peercntl = 0; - pterm_name = argv[3]; - } - else if (!strcmp (argv[2], "pty-master")) - { - type = T_PTYMASTER; + pterm_name = tty_arg; + break; + + case T_PTYMASTER: bottom = &ptyio_bottom; ourclass = pty_class; ourcntlclass = pty_cntl_class; @@ -108,10 +163,9 @@ peerclass = tty_class; peercntlclass = tty_cntl_class; peercntl = &termctl; - } - else if (!strcmp (argv[2], "pty-slave")) - { - type = T_PTYSLAVE; + break; + + case T_PTYSLAVE: bottom = &ptyio_bottom; ourclass = tty_class; ourcntlclass = tty_cntl_class; @@ -119,11 +173,11 @@ peerclass = pty_class; peercntlclass = pty_cntl_class; peercntl = &ptyctl; - } - else - { - fprintf (stderr, - "Allowable types are device, hurdio, pty-master, and pty-slave.\n"); + break; + + default: + /* Should not happen. */ + fprintf (stderr, "Unknown terminal type is unknown.\n"); exit (1); } @@ -147,12 +201,12 @@ /* For ptys, the nodename depends on which half is used. For now just use the hook to store the nodename. */ - (*ourcntl)->hook = argv[1]; + (*ourcntl)->hook = tty_name; /* Set peer */ if (peerclass) { - char *peer_name = argv[3]; + char *peer_name = tty_arg; file_t file = file_name_lookup (peer_name, O_CREAT|O_NOTRANS, 0666); if (file != MACH_PORT_NULL) @@ -206,7 +260,7 @@ outputq = create_queue (256, QUEUE_LOWAT, QUEUE_HIWAT); - errno = (*bottom)->init (); + errno = (*bottom->init) (); if (errno) { perror ("Initializing bottom handler"); diff -ru term.new/ptyio.c term.new2/ptyio.c --- term.new/ptyio.c Fri Feb 8 18:58:52 2002 +++ term.new2/ptyio.c Fri Feb 8 21:12:18 2002 @@ -1,5 +1,5 @@ /* - Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1999, 2002 Free Software Foundation, Inc. Written by Michael I. Bushnell, p/BSG. This file is part of the GNU Hurd. diff -ru term.new/term.h term.new2/term.h --- term.new/term.h Fri Feb 8 18:39:49 2002 +++ term.new2/term.h Fri Feb 8 21:30:22 2002 @@ -323,9 +323,6 @@ void write_character (int); void init_users (void); -/* Call this before using ptyio_bottom. */ -void ptyio_init (void); - /* kludge--these are pty versions of trivfs_S_io_* functions called by the real functions in users.c to do work for ptys. */ error_t pty_io_write (struct trivfs_protid *, char *, -- `Rhubarb is no Egyptian god.' Debian http://www.debian.org [EMAIL PROTECTED] Marcus Brinkmann GNU http://www.gnu.org [EMAIL PROTECTED] [EMAIL PROTECTED] http://www.marcus-brinkmann.de _______________________________________________ Bug-hurd mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-hurd