home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / uucp / uupick / uupick.c < prev   
C/C++ Source or Header  |  1995-08-20  |  8KB  |  370 lines

  1. /* uupick.c
  2.    Get files stored in the public directory by uucp -t.
  3.  
  4.    Copyright (C) 1992, 1993, 1994, 1995 Ian Lance Taylor
  5.  
  6.    This file is part of the Taylor UUCP package.
  7.  
  8.    This program is free software; you can redistribute it and/or
  9.    modify it under the terms of the GNU General Public License as
  10.    published by the Free Software Foundation; either version 2 of the
  11.    License, or (at your option) any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful, but
  14.    WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.    General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  
  22.    The author of the program may be contacted at ian@airs.com or
  23.    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
  24.    */
  25.  
  26. #include "uucp.h"
  27.  
  28. #if USE_RCS_ID
  29. const char uupick_rcsid[] = "$Id: uupick.c,v 1.16 1995/06/29 19:38:55 ian Rel $";
  30. #endif
  31.  
  32. #include <errno.h>
  33.  
  34. #include "getopt.h"
  35.  
  36. #include "uudefs.h"
  37. #include "uuconf.h"
  38. #include "system.h"
  39.  
  40. /* Local functions.  */
  41.  
  42. static void upmovedir P((const char *zfull, const char *zrelative,
  43.              pointer pinfo));
  44. static void upmove P((const char *zfrom, const char *zto));
  45.  
  46. /* Long getopt options.  */
  47. static const struct option asPlongopts[] =
  48. {
  49.   { "system", required_argument, NULL, 's' },
  50.   { "config", required_argument, NULL, 'I' },
  51.   { "debug", required_argument, NULL, 'x' },
  52.   { "version", no_argument, NULL, 'v' },
  53.   { "help", no_argument, NULL, 1 },
  54.   { NULL, 0, NULL, 0 }
  55. };
  56.  
  57. /* Local functions.  */
  58.  
  59. static void upusage P((void));
  60. static void uphelp P((void));
  61.  
  62. int
  63. main (argc, argv)
  64.      int argc;
  65.      char **argv;
  66. {
  67.   /* -s: system name.  */
  68.   const char *zsystem = NULL;
  69.   /* -I: configuration file name.  */
  70.   const char *zconfig = NULL;
  71.   int iopt;
  72.   pointer puuconf;
  73.   int iuuconf;
  74.   const char *zpubdir;
  75.   char *zfile, *zfrom, *zfull;
  76.   char *zallsys;
  77.   char ab[1000];
  78.   boolean fquit;
  79.  
  80.   zProgram = "uupick";
  81.  
  82.   while ((iopt = getopt_long (argc, argv, "I:s:vx:", asPlongopts,
  83.                   (int *) NULL)) != EOF)
  84.     {
  85.       switch (iopt)
  86.     {
  87.     case 's':
  88.       /* System name to get files from.  */
  89.       zsystem = optarg;
  90.       break;
  91.  
  92.     case 'I':
  93.       /* Name configuration file.  */
  94.       if (fsysdep_other_config (optarg))
  95.         zconfig = optarg;
  96.       break;
  97.  
  98.     case 'x':
  99. #if DEBUG > 1
  100.       /* Set debugging level.  */
  101.       iDebug |= idebug_parse (optarg);
  102. #endif
  103.       break;
  104.  
  105.     case 'v':
  106.       /* Print version and exit.  */
  107.       fprintf
  108.         (stderr,
  109.          "%s: Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
  110.          zProgram, VERSION);
  111.       exit (EXIT_SUCCESS);
  112.       /*NOTREACHED*/
  113.  
  114.     case 1:
  115.       /* --help.  */
  116.       uphelp ();
  117.       exit (EXIT_SUCCESS);
  118.       /*NOTREACHED*/
  119.  
  120.     case 0:
  121.       /* Long option found and flag set.  */
  122.       break;
  123.  
  124.     default:
  125.       upusage ();
  126.       /*NOTREACHED*/
  127.     }
  128.     }
  129.  
  130.   if (argc != optind)
  131.     upusage ();
  132.  
  133.   iuuconf = uuconf_init (&puuconf, (const char *) NULL, zconfig);
  134.   if (iuuconf != UUCONF_SUCCESS)
  135.     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
  136.  
  137.   usysdep_initialize (puuconf, INIT_GETCWD | INIT_NOCHDIR);
  138.  
  139.   zpubdir = NULL;
  140.   if (zsystem != NULL)
  141.     {
  142.       struct uuconf_system ssys;
  143.  
  144.       /* Get the public directory for the system.  If we can't find
  145.          the system information, just use the standard public
  146.          directory, since uupick is not setuid.  */
  147.       iuuconf = uuconf_system_info (puuconf, zsystem, &ssys);
  148.       if (iuuconf == UUCONF_SUCCESS)
  149.     {
  150.       zpubdir = zbufcpy (ssys.uuconf_zpubdir);
  151.       (void) uuconf_system_free (puuconf, &ssys);
  152.     }
  153.     }
  154.   if (zpubdir == NULL)
  155.     {
  156.       iuuconf = uuconf_pubdir (puuconf, &zpubdir);
  157.       if (iuuconf != UUCONF_SUCCESS)
  158.     ulog_uuconf (LOG_FATAL, puuconf, iuuconf);
  159.     }
  160.  
  161.   if (! fsysdep_uupick_init (zsystem, zpubdir))
  162.     usysdep_exit (FALSE);
  163.  
  164.   zallsys = NULL;
  165.   fquit = FALSE;
  166.  
  167.   while (! fquit
  168.      && ((zfile = zsysdep_uupick (zsystem, zpubdir, &zfrom, &zfull))
  169.          != NULL))
  170.     {
  171.       boolean fdir;
  172.       char *zto, *zlocal;
  173.       FILE *e;
  174.       boolean fcontinue;
  175.  
  176.       fdir = fsysdep_directory (zfull);
  177.  
  178.       do
  179.     {
  180.       boolean fbadname;
  181.  
  182.       fcontinue = FALSE;
  183.  
  184.       if (zallsys == NULL
  185.           || strcmp (zallsys, zfrom) != 0)
  186.         {
  187.           if (zallsys != NULL)
  188.         {
  189.           ubuffree (zallsys);
  190.           zallsys = NULL;
  191.         }
  192.  
  193.           printf ("from %s: %s %s ?\n", zfrom, fdir ? "dir" : "file",
  194.               zfile);
  195.  
  196.           if (fgets (ab, sizeof ab, stdin) == NULL)
  197.         break;
  198.         }
  199.  
  200.       if (ab[0] == 'q')
  201.         {
  202.           fquit = TRUE;
  203.           break;
  204.         }
  205.  
  206.       switch (ab[0])
  207.         {
  208.         case '\n':
  209.           break;
  210.  
  211.         case 'd':
  212.           if (fdir)
  213.         (void) fsysdep_rmdir (zfull);
  214.           else
  215.         {
  216.           if (remove (zfull) != 0)
  217.             ulog (LOG_ERROR, "remove (%s): %s", zfull,
  218.               strerror(errno));
  219.         }
  220.           break;
  221.  
  222.         case 'm':
  223.         case 'a':
  224.           zto = ab + 1 + strspn (ab + 1, " \t");
  225.           zto[strcspn (zto, " \t\n")] = '\0';
  226.           zlocal = zsysdep_uupick_local_file (zto, &fbadname);
  227.           if (zlocal == NULL)
  228.         {
  229.           if (! fbadname)
  230.             usysdep_exit (FALSE);
  231.           ulog (LOG_ERROR, "%s: bad local file name", zto);
  232.           fcontinue = TRUE;
  233.           break;
  234.         }
  235.           zto = zsysdep_in_dir (zlocal, zfile);
  236.           ubuffree (zlocal);
  237.           if (zto == NULL)
  238.         usysdep_exit (FALSE);
  239.           if (! fdir)
  240.         upmove (zfull, zto);
  241.           else
  242.         {
  243.           usysdep_walk_tree (zfull, upmovedir, (pointer) zto);
  244.           (void) fsysdep_rmdir (zfull);
  245.         }
  246.           ubuffree (zto);
  247.  
  248.           if (ab[0] == 'a')
  249.         {
  250.           zallsys = zbufcpy (zfrom);
  251.           ab[0] = 'm';
  252.         }
  253.  
  254.           break;
  255.  
  256.         case 'p':
  257.           if (fdir)
  258.         ulog (LOG_ERROR, "Can't print directory");
  259.           else
  260.         {
  261.           e = fopen (zfull, "r");
  262.           if (e == NULL)
  263.             ulog (LOG_ERROR, "fopen (%s): %s", zfull,
  264.               strerror (errno));
  265.           else
  266.             {
  267.               while (fgets (ab, sizeof ab, e) != NULL)
  268.             (void) fputs (ab, stdout);
  269.               (void) fclose (e);
  270.             }
  271.         }
  272.           fcontinue = TRUE;
  273.           break;
  274.  
  275.         case '!':
  276.           (void) system (ab + 1);
  277.           fcontinue = TRUE;
  278.           break;
  279.  
  280.         default:
  281.           printf ("uupick commands:\n");
  282.           printf ("q: quit\n");
  283.           printf ("<return>: skip file\n");
  284.           printf ("m [dir]: move file to directory\n");
  285.           printf ("a [dir]: move all files from this system to directory\n");
  286.           printf ("p: list file to stdout\n");
  287.           printf ("d: delete file\n");
  288.           printf ("! command: shell escape\n");
  289.           fcontinue = TRUE;
  290.           break;
  291.         }
  292.     }
  293.       while (fcontinue);
  294.  
  295.       ubuffree (zfull);
  296.       ubuffree (zfrom);
  297.       ubuffree (zfile);
  298.     }
  299.  
  300.   (void) fsysdep_uupick_free (zsystem, zpubdir);
  301.  
  302.   usysdep_exit (TRUE);
  303.  
  304.   /* Avoid error about not returning.  */
  305.   return 0;
  306. }
  307.  
  308. /* Print usage message and die.  */
  309.  
  310. static void
  311. upusage ()
  312. {
  313.   fprintf (stderr,
  314.        "Usage: %s [-s system] [-I config] [-x debug]\n", zProgram);
  315.   fprintf (stderr, "Use %s --help for help\n", zProgram);
  316.   exit (EXIT_FAILURE);
  317. }
  318.  
  319. /* Print help message.  */
  320.  
  321. static void
  322. uphelp ()
  323. {
  324.   fprintf (stderr,
  325.        "Taylor UUCP %s, copyright (C) 1991, 92, 93, 94, 1995 Ian Lance Taylor\n",
  326.        VERSION);
  327.   fprintf (stderr,
  328.        " -s,--system system: Only consider files from named system\n");
  329.   fprintf (stderr,
  330.        " -x,--debug debug: Set debugging level\n");
  331. #if HAVE_TAYLOR_CONFIG
  332.   fprintf (stderr,
  333.        " -I,--config file: Set configuration file to use\n");
  334. #endif /* HAVE_TAYLOR_CONFIG */
  335.   fprintf (stderr,
  336.        " -v,--version: Print version and exit\n");
  337.   fprintf (stderr,
  338.        " --help: Print help and exit\n");
  339. }
  340.  
  341. /* This routine is called by usysdep_walk_tree when moving the
  342.    contents of an entire directory.  */
  343.  
  344. static void
  345. upmovedir (zfull, zrelative, pinfo)
  346.      const char *zfull;
  347.      const char *zrelative;
  348.      pointer pinfo;
  349. {
  350.   const char *ztodir = (const char *) pinfo;
  351.   char *zto;
  352.  
  353.   zto = zsysdep_in_dir (ztodir, zrelative);
  354.   if (zto == NULL)
  355.     usysdep_exit (FALSE);
  356.   upmove (zfull, zto);
  357.   ubuffree (zto);
  358. }
  359.  
  360. /* Move a file.  */
  361.  
  362. static void
  363. upmove (zfrom, zto)
  364.      const char *zfrom;
  365.      const char *zto;
  366. {
  367.   (void) fsysdep_move_file (zfrom, zto, TRUE, TRUE, FALSE,
  368.                 (const char *) NULL);
  369. }
  370.