home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / uucp / Uucp.framework / unix.subproj / wldcrd.c < prev    next >
C/C++ Source or Header  |  1995-10-09  |  5KB  |  214 lines

  1. /* wldcrd.c
  2.    Expand wildcards.
  3.  
  4.    Copyright (C) 1991, 1992, 1993 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. #include "uudefs.h"
  29. #include "sysdep.h"
  30. #include "system.h"
  31.  
  32. #include <ctype.h>
  33. #include <errno.h>
  34.  
  35. #if HAVE_GLOB && ! HAVE_GLOB_H
  36. #undef HAVE_GLOB
  37. #define HAVE_GLOB 0
  38. #endif
  39.  
  40. #if HAVE_GLOB
  41. #include <glob.h>
  42. #endif
  43.  
  44. /* Local variables to hold the wildcard in progress.  */
  45.  
  46. #if HAVE_GLOB
  47. static glob_t sSglob;
  48. static int iSglob;
  49. #else
  50. static char *zSwildcard_alloc;
  51. static char *zSwildcard;
  52. #endif
  53.  
  54. /* Start getting a wildcarded file spec.  Use the glob function if it
  55.    is available, and otherwise use the shell.  */
  56.  
  57. boolean
  58. fsysdep_wildcard_start (zfile)
  59.      const char *zfile;
  60. {
  61. #if HAVE_GLOB
  62.  
  63. #if DEBUG > 0
  64.   if (*zfile != '/')
  65.     ulog (LOG_FATAL, "fsysdep_wildcard: %s: Can't happen", zfile);
  66. #endif
  67.  
  68.   if (glob (zfile, 0, (int (*) ()) NULL, &sSglob) != 0)
  69.     sSglob.gl_pathc = 0;
  70.   iSglob = 0;
  71.   return TRUE;
  72.  
  73. #else /* ! HAVE_GLOB */
  74.  
  75.   char *zcmd, *zto;
  76.   const char *zfrom;
  77.   size_t c;
  78.   const char *azargs[4];
  79.   FILE *e;
  80.   pid_t ipid;
  81.  
  82. #if DEBUG > 0
  83.   if (*zfile != '/')
  84.     ulog (LOG_FATAL, "fsysdep_wildcard: %s: Can't happen", zfile);
  85. #endif
  86.  
  87.   zSwildcard_alloc = NULL;
  88.   zSwildcard = NULL;
  89.  
  90.   zcmd = zbufalc (sizeof ECHO_PROGRAM + sizeof " " + 2 * strlen (zfile));
  91.   memcpy (zcmd, ECHO_PROGRAM, sizeof ECHO_PROGRAM - 1);
  92.   zto = zcmd + sizeof ECHO_PROGRAM - 1;
  93.   *zto++ = ' ';
  94.   zfrom = zfile;
  95.   while (*zfrom != '\0')
  96.     {
  97.       /* To avoid shell trickery, we quote all characters except
  98.      letters, digits, and wildcard specifiers.  We don't quote '/'
  99.      to avoid an Ultrix sh bug.  */
  100.       if (! isalnum (*zfrom)
  101.       && *zfrom != '*'
  102.       && *zfrom != '?'
  103.       && *zfrom != '['
  104.       && *zfrom != ']'
  105.       && *zfrom != '/')
  106.     *zto++ = '\\';
  107.       *zto++ = *zfrom++;
  108.     }
  109.   *zto = '\0';
  110.  
  111.   azargs[0] = "/bin/sh";
  112.   azargs[1] = "-c";
  113.   azargs[2] = zcmd;
  114.   azargs[3] = NULL;
  115.  
  116.   e = espopen (azargs, TRUE, &ipid);
  117.  
  118.   ubuffree (zcmd);
  119.  
  120.   if (e == NULL)
  121.     {
  122.       ulog (LOG_ERROR, "espopen: %s", strerror (errno));
  123.       return FALSE;
  124.     }
  125.  
  126.   zSwildcard_alloc = NULL;
  127.   c = 0;
  128.   if (getline (&zSwildcard_alloc, &c, e) <= 0)
  129.     {
  130.       xfree ((pointer) zSwildcard_alloc);
  131.       zSwildcard_alloc = NULL;
  132.     }
  133.  
  134.   if (ixswait ((unsigned long) ipid, ECHO_PROGRAM) != 0)
  135.     {
  136.       xfree ((pointer) zSwildcard_alloc);
  137.       return FALSE;
  138.     }
  139.  
  140.   if (zSwildcard_alloc == NULL)
  141.     return FALSE;
  142.  
  143.   DEBUG_MESSAGE1 (DEBUG_EXECUTE,
  144.           "fsysdep_wildcard_start: got \"%s\"",
  145.           zSwildcard_alloc);
  146.  
  147.   zSwildcard = zSwildcard_alloc;
  148.  
  149.   return TRUE;
  150.  
  151. #endif /* ! HAVE_GLOB */
  152. }
  153.  
  154. /* Get the next wildcard spec.  */
  155.  
  156. /*ARGSUSED*/
  157. char *
  158. zsysdep_wildcard (zfile)
  159.      const char *zfile;
  160. {
  161. #if HAVE_GLOB
  162.  
  163.   char *zret;
  164.  
  165.   if (iSglob >= sSglob.gl_pathc)
  166.     return NULL;
  167.   zret = zbufcpy (sSglob.gl_pathv[iSglob]);
  168.   ++iSglob;
  169.   return zret;
  170.   
  171. #else /* ! HAVE_GLOB */
  172.  
  173.   char *zret;
  174.  
  175.   if (zSwildcard_alloc == NULL || zSwildcard == NULL)
  176.     return NULL;
  177.  
  178.   zret = zSwildcard;
  179.  
  180.   while (*zSwildcard != '\0' && ! isspace (BUCHAR (*zSwildcard)))
  181.     ++zSwildcard;
  182.  
  183.   if (*zSwildcard != '\0')
  184.     {
  185.       *zSwildcard = '\0';
  186.       ++zSwildcard;
  187.       while (*zSwildcard != '\0' && isspace (BUCHAR (*zSwildcard)))
  188.     ++zSwildcard;
  189.     }
  190.  
  191.   if (*zSwildcard == '\0')
  192.     zSwildcard = NULL;
  193.  
  194.   return zbufcpy (zret);
  195.  
  196. #endif /* ! HAVE_GLOB */
  197. }
  198.  
  199. /* Finish up getting wildcard specs.  */
  200.  
  201. boolean
  202. fsysdep_wildcard_end ()
  203. {
  204. #if HAVE_GLOB
  205.   globfree (&sSglob);
  206.   return TRUE;
  207. #else /* ! HAVE_GLOB */
  208.   xfree ((pointer) zSwildcard_alloc);
  209.   zSwildcard_alloc = NULL;
  210.   zSwildcard = NULL;
  211.   return TRUE;
  212. #endif /* ! HAVE_GLOB */
  213. }
  214.