bug-inetutils
[Top][All Lists]
Advanced

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

[bug-inetutils] Argpifying ftp


From: Debarshi 'Rishi' Ray
Subject: [bug-inetutils] Argpifying ftp
Date: Mon, 4 Jun 2007 22:59:29 +0530

Here is the current status of the patch to argpify 'ftp' and some minor changes.

diff -urNp inetutils/ftp/cmds.c inetutils-build/ftp/cmds.c
--- inetutils/ftp/cmds.c        2006-10-21 23:38:45.000000000 +0530
+++ inetutils-build/ftp/cmds.c  2007-06-04 22:43:03.000000000 +0530
@@ -1567,7 +1567,7 @@ shell (argc, argv)
        }
      error (0, errno, "shell");
      code = -1;
-      exit (1);
+      exit (EXIT_FAILURE);
    }
  if (pid > 0)
    while (wait (0) != pid)
@@ -1838,15 +1838,23 @@ quit (argc, argv)
     int argc;
     char *argv[];
{
+  int disconnected=1;

  if (connected)
-    disconnect (0, 0);
+    {
+      disconnect (0, 0);
+      disconnected = 0;
+    }
  pswitch (1);
  if (connected)
    {
      disconnect (0, 0);
+      disconnected = 0;
    }
-  exit (0);
+
+  if (disconnected)
+    printf ("\n");
+  exit (EXIT_SUCCESS);
}

/*
diff -urNp inetutils/ftp/main.c inetutils-build/ftp/main.c
--- inetutils/ftp/main.c        2007-03-22 03:17:09.000000000 +0530
+++ inetutils-build/ftp/main.c  2007-06-04 22:41:53.000000000 +0530
@@ -41,6 +41,7 @@

#include <arpa/ftp.h>

+#include <argp.h>
#include <ctype.h>
#include <error.h>
#include <netdb.h>
@@ -48,133 +49,108 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <getopt.h>

/* Define macro to nothing so declarations in ftp_var.h become definitions. */
#define FTP_EXTERN
#include "ftp_var.h"

+#include "libinetutils.h"
+
#if HAVE_READLINE_READLINE_H
# include <readline/readline.h>
#endif


-char *program_name;
-
#define DEFAULT_PROMPT "ftp> "
static char *prompt = 0;

-static void
-usage (int err)
+ARGP_PROGRAM_DATA ("ftp", "2007", "FIXME unknown");
+
+const char args_doc[] = "[HOST [PORT]]";
+const char doc[] = "Remote file transfer.";
+
+static struct argp_option argp_options[] = {
+#define GRP 0
+  {"debug", 'd', NULL, 0, "Set the SO_DEBUG option", GRP+1},
+  {"no-glob", 'g', NULL, 0, "Turn off file name globbing", GRP+1},
+  {"no-prompt", 'i', NULL, 0, "Don't prompt during multiple file transfers",
+   GRP+1},
+  {"no-login", 'n', NULL, 0, "Don't automatically login to the remote system",
+   GRP+1},
+  {"trace", 't', NULL, 0, "Enable packet tracing", GRP+1},
+  {"prompt", 'p', "PROMPT", OPTION_ARG_OPTIONAL, "Print a command line PROMPT "
+   "(optionally), even if not on a tty", GRP+1},
+  {"verbose", 'v', NULL, 0, "Be verbose", GRP+1},
+#undef GRP
+  {NULL}
+};
+
+static error_t
+parse_opt (int key, char *arg, struct argp_state *state)
{
-  if (err != 0)
+  switch (key)
    {
-      fprintf (stderr, "Usage: %s [OPTION...] [HOST [PORT]]\n", program_name);
-      fprintf (stderr, "Try `%s --help' for more information.\n",
-              program_name);
-    }
-  else
-    {
-      fprintf (stdout, "Usage: %s [OPTION...] [HOST [PORT]]\n", program_name);
-      puts ("Remote file transfer.\n\n\
-  -d, --debug                Turn on debugging mode\n\
-  -g, --no-glob              Turn off file name globbing\n\
-  -i, --no-prompt            Don't prompt during multiple-file transfers\n\
-  -n, --no-login             Don't automatically login to the remote system\n\
-  -t, --trace                Enable packet tracing\n\
-  -p, --prompt[=PROMPT]      Print a command-line prompt (optionally
PROMPT),\n\
-                             even if not on a tty\n\
-  -v, --verbose              Be verbose\n\
-      --help                 Give this help list\n\
-  -V, --version              Print program version");
+    case 'd':          /* Enable debug mode.  */
+      options |= SO_DEBUG;
+      debug++;
+      break;
+
+    case 'g':          /* No glob.  */
+      doglob = 0;
+      break;

-      fprintf (stdout, "\nSubmit bug reports to %s.\n", PACKAGE_BUGREPORT);
+    case 'i':          /* No prompt.  */
+      interactive = 0;
+      break;
+
+    case 'n':          /* No automatic login.  */
+      autologin = 0;
+      break;
+
+    case 't':          /* Enable packet tracing.  */
+      trace++;
+      break;
+
+    case 'v':          /* Verbose.  */
+      verbose++;
+      break;
+
+    case 'p':          /* Print command line prompt.  */
+      prompt = arg ? arg : DEFAULT_PROMPT;
+      break;
+
+    default:
+      return ARGP_ERR_UNKNOWN;
    }
-  exit (err);
+
+  return 0;
}

-static const char *short_options = "dginp::tv";
-static struct option long_options[] = {
-  {"trace", no_argument, 0, 't'},
-  {"verbose", no_argument, 0, 'v'},
-  {"no-login", no_argument, 0, 'n'},
-  {"no-prompt", no_argument, 0, 'i'},
-  {"debug", no_argument, 0, 'd'},
-  {"no-glob", no_argument, 0, 'g'},
-  {"help", no_argument, 0, '&'},
-  {"prompt", optional_argument, 0, 'p'},
-  {"version", no_argument, 0, 'V'},
-  {0}
-};
+static struct argp argp = {argp_options, parse_opt, args_doc, doc};

+
int
main (int argc, char *argv[])
{
  int ch, top;
+  int index;
  struct passwd *pw = NULL;
  char *cp;

-  program_name = argv[0];
-
  sp = getservbyname ("ftp", "tcp");
  if (sp == 0)
-    error (1, 0, "ftp/tcp: unknown service");
+    error (EXIT_FAILURE, 0, "ftp/tcp: unknown service");
  doglob = 1;
  interactive = 1;
  autologin = 1;

-  while ((ch = getopt_long (argc, argv, short_options, long_options, 0))
-        != EOF)
-    {
-      switch (ch)
-       {
-       case 'd':               /* Enable ebug mode.  */
-         options |= SO_DEBUG;
-         debug++;
-         break;
-
-       case 'g':               /* No glob.  */
-         doglob = 0;
-         break;
-
-       case 'i':               /* No prompt.  */
-         interactive = 0;
-         break;
-
-       case 'n':               /* No automatic login.  */
-         autologin = 0;
-         break;
-
-       case 't':               /* Enable packet tracing.  */
-         trace++;
-         break;
-
-       case 'v':               /* Verbose.  */
-         verbose++;
-         break;
-
-       case 'p':               /* Print command line prompt.  */
-         prompt = optarg ? optarg : DEFAULT_PROMPT;
-         break;
-
-       case '&':           /* Usage.  */
-         usage (0);
-         /* Not reached.  */
-
-       case 'V':               /* Version.  */
-         printf ("ftp (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
-         exit (0);
-
-       case '?':
-       default:
-         usage (1);
-         /* Not reached.  */
-       }
-    }
+  /* Parse command line */
+  argp_parse (&argp, argc, argv, 0, &index, NULL);

-  argc -= optind;
-  argv += optind;
+  argc -= index;
+  argv += index;

  fromatty = isatty (fileno (stdin));
  if (fromatty)
@@ -211,10 +187,10 @@ main (int argc, char *argv[])
      char *xargv[5];

      if (setjmp (toplevel))
-       exit (0);
+       exit (EXIT_SUCCESS);
      signal (SIGINT, intr);
      signal (SIGPIPE, lostpeer);
-      xargv[0] = program_name;
+      xargv[0] = program_invocation_name;
      xargv[1] = argv[0];
      xargv[2] = argv[1];
      xargv[3] = argv[2];

Comments?

Happy hacking,
Debarshi
--
GPG key ID: 63D4A5A7
Key server: pgp.mit.edu




reply via email to

[Prev in Thread] Current Thread [Next in Thread]