|
|
1.1 ! root 1: /* wldcrd.c ! 2: Expand wildcards. ! 3: ! 4: Copyright (C) 1991, 1992 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., 675 Mass Ave, Cambridge, MA 02139, USA. ! 21: ! 22: The author of the program may be contacted at [email protected] or ! 23: c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. ! 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: ubuffree (zcmd); ! 117: ! 118: e = espopen (azargs, TRUE, &ipid); ! 119: if (e == NULL) ! 120: { ! 121: ulog (LOG_ERROR, "espopen: %s", strerror (errno)); ! 122: return FALSE; ! 123: } ! 124: ! 125: zSwildcard_alloc = NULL; ! 126: c = 0; ! 127: if (getline (&zSwildcard_alloc, &c, e) <= 0) ! 128: { ! 129: xfree ((pointer) zSwildcard_alloc); ! 130: zSwildcard_alloc = NULL; ! 131: } ! 132: ! 133: if (ixswait ((unsigned long) ipid, ECHO_PROGRAM) != 0) ! 134: { ! 135: xfree ((pointer) zSwildcard_alloc); ! 136: return FALSE; ! 137: } ! 138: ! 139: if (zSwildcard_alloc == NULL) ! 140: return FALSE; ! 141: ! 142: DEBUG_MESSAGE1 (DEBUG_EXECUTE, ! 143: "fsysdep_wildcard_start: got \"%s\"", ! 144: zSwildcard_alloc); ! 145: ! 146: zSwildcard = zSwildcard_alloc; ! 147: ! 148: return TRUE; ! 149: ! 150: #endif /* ! HAVE_GLOB */ ! 151: } ! 152: ! 153: /* Get the next wildcard spec. */ ! 154: ! 155: /*ARGSUSED*/ ! 156: char * ! 157: zsysdep_wildcard (zfile) ! 158: const char *zfile; ! 159: { ! 160: #if HAVE_GLOB ! 161: ! 162: char *zret; ! 163: ! 164: if (iSglob >= sSglob.gl_pathc) ! 165: return NULL; ! 166: zret = zbufcpy (sSglob.gl_pathv[iSglob]); ! 167: ++iSglob; ! 168: return zret; ! 169: ! 170: #else /* ! HAVE_GLOB */ ! 171: ! 172: char *zret; ! 173: ! 174: if (zSwildcard_alloc == NULL || zSwildcard == NULL) ! 175: return NULL; ! 176: ! 177: zret = zSwildcard; ! 178: ! 179: while (*zSwildcard != '\0' && ! isspace (BUCHAR (*zSwildcard))) ! 180: ++zSwildcard; ! 181: ! 182: if (*zSwildcard != '\0') ! 183: { ! 184: *zSwildcard = '\0'; ! 185: ++zSwildcard; ! 186: while (*zSwildcard != '\0' && isspace (BUCHAR (*zSwildcard))) ! 187: ++zSwildcard; ! 188: } ! 189: ! 190: if (*zSwildcard == '\0') ! 191: zSwildcard = NULL; ! 192: ! 193: return zbufcpy (zret); ! 194: ! 195: #endif /* ! HAVE_GLOB */ ! 196: } ! 197: ! 198: /* Finish up getting wildcard specs. */ ! 199: ! 200: boolean ! 201: fsysdep_wildcard_end () ! 202: { ! 203: #if HAVE_GLOB ! 204: globfree (&sSglob); ! 205: return TRUE; ! 206: #else /* ! HAVE_GLOB */ ! 207: xfree ((pointer) zSwildcard_alloc); ! 208: zSwildcard_alloc = NULL; ! 209: zSwildcard = NULL; ! 210: return TRUE; ! 211: #endif /* ! HAVE_GLOB */ ! 212: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.