|
|
1.1 ! root 1: /* picksb.c ! 2: System dependent routines for uupick. ! 3: ! 4: Copyright (C) 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: #if USE_RCS_ID ! 29: const char picksb_rcsid[] = "$Id: picksb.c,v 1.1 93/07/30 08:02:42 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include "uudefs.h" ! 33: #include "system.h" ! 34: #include "sysdep.h" ! 35: ! 36: #include <errno.h> ! 37: #include <pwd.h> ! 38: ! 39: #if HAVE_OPENDIR ! 40: #if HAVE_DIRENT_H ! 41: #include <dirent.h> ! 42: #else /* ! HAVE_DIRENT_H */ ! 43: #include <sys/dir.h> ! 44: #define dirent direct ! 45: #endif /* ! HAVE_DIRENT_H */ ! 46: #endif /* HAVE_OPENDIR */ ! 47: ! 48: #if GETPWUID_DECLARATION_OK ! 49: #ifndef getpwuid ! 50: extern struct passwd *getpwuid (); ! 51: #endif ! 52: #endif ! 53: ! 54: /* Local variables. */ ! 55: ! 56: /* Directory of ~/receive/USER. */ ! 57: static DIR *qStopdir; ! 58: ! 59: /* Name of ~/receive/USER. */ ! 60: static char *zStopdir; ! 61: ! 62: /* Directory of ~/receive/USER/SYSTEM. */ ! 63: static DIR *qSsysdir; ! 64: ! 65: /* Name of system. */ ! 66: static char *zSsysdir; ! 67: ! 68: /* Prepare to get a list of all the file to uupick for this user. */ ! 69: ! 70: /*ARGSUSED*/ ! 71: boolean ! 72: fsysdep_uupick_init (zsystem, zpubdir) ! 73: const char *zsystem; ! 74: const char *zpubdir; ! 75: { ! 76: const char *zuser; ! 77: ! 78: zuser = zsysdep_login_name (); ! 79: ! 80: zStopdir = (char *) xmalloc (strlen (zpubdir) ! 81: + sizeof "/receive/" ! 82: + strlen (zuser)); ! 83: sprintf (zStopdir, "%s/receive/%s", zpubdir, zuser); ! 84: ! 85: qStopdir = opendir (zStopdir); ! 86: if (qStopdir == NULL && errno != ENOENT) ! 87: { ! 88: ulog (LOG_ERROR, "opendir (%s): %s", zStopdir, ! 89: strerror (errno)); ! 90: return FALSE; ! 91: } ! 92: ! 93: qSsysdir = NULL; ! 94: ! 95: return TRUE; ! 96: } ! 97: ! 98: /* Return the next file from the uupick directories. */ ! 99: ! 100: /*ARGSUSED*/ ! 101: char * ! 102: zsysdep_uupick (zsysarg, zpubdir, pzfrom, pzfull) ! 103: const char *zsysarg; ! 104: const char *zpubdir; ! 105: char **pzfrom; ! 106: char **pzfull; ! 107: { ! 108: struct dirent *qentry; ! 109: ! 110: while (TRUE) ! 111: { ! 112: while (qSsysdir == NULL) ! 113: { ! 114: const char *zsystem; ! 115: char *zdir; ! 116: ! 117: if (qStopdir == NULL) ! 118: return NULL; ! 119: ! 120: if (zsysarg != NULL) ! 121: { ! 122: closedir (qStopdir); ! 123: qStopdir = NULL; ! 124: zsystem = zsysarg; ! 125: } ! 126: else ! 127: { ! 128: do ! 129: { ! 130: qentry = readdir (qStopdir); ! 131: if (qentry == NULL) ! 132: { ! 133: closedir (qStopdir); ! 134: qStopdir = NULL; ! 135: return NULL; ! 136: } ! 137: } ! 138: while (strcmp (qentry->d_name, ".") == 0 ! 139: || strcmp (qentry->d_name, "..") == 0); ! 140: ! 141: zsystem = qentry->d_name; ! 142: } ! 143: ! 144: zdir = zbufalc (strlen (zStopdir) + strlen (zsystem) + sizeof "/"); ! 145: sprintf (zdir, "%s/%s", zStopdir, zsystem); ! 146: ! 147: qSsysdir = opendir (zdir); ! 148: if (qSsysdir == NULL) ! 149: { ! 150: if (errno != ENOENT && errno != ENOTDIR) ! 151: ulog (LOG_ERROR, "opendir (%s): %s", zdir, strerror (errno)); ! 152: } ! 153: else ! 154: { ! 155: ubuffree (zSsysdir); ! 156: zSsysdir = zbufcpy (zsystem); ! 157: } ! 158: ! 159: ubuffree (zdir); ! 160: } ! 161: ! 162: qentry = readdir (qSsysdir); ! 163: if (qentry == NULL) ! 164: { ! 165: closedir (qSsysdir); ! 166: qSsysdir = NULL; ! 167: continue; ! 168: } ! 169: ! 170: if (strcmp (qentry->d_name, ".") == 0 ! 171: || strcmp (qentry->d_name, "..") == 0) ! 172: continue; ! 173: ! 174: *pzfrom = zbufcpy (zSsysdir); ! 175: *pzfull = zsappend3 (zStopdir, zSsysdir, qentry->d_name); ! 176: return zbufcpy (qentry->d_name); ! 177: } ! 178: } ! 179: ! 180: /*ARGSUSED*/ ! 181: boolean ! 182: fsysdep_uupick_free (zsystem, zpubdir) ! 183: const char *zsystem; ! 184: const char *zpubdir; ! 185: { ! 186: xfree ((pointer) zStopdir); ! 187: if (qStopdir != NULL) ! 188: { ! 189: closedir (qStopdir); ! 190: qStopdir = NULL; ! 191: } ! 192: ubuffree (zSsysdir); ! 193: zSsysdir = NULL; ! 194: if (qSsysdir != NULL) ! 195: { ! 196: closedir (qSsysdir); ! 197: qSsysdir = NULL; ! 198: } ! 199: ! 200: return TRUE; ! 201: } ! 202: ! 203: /* Expand a local file name for uupick. */ ! 204: ! 205: char * ! 206: zsysdep_uupick_local_file (zfile) ! 207: const char *zfile; ! 208: { ! 209: struct passwd *q; ! 210: ! 211: /* If this does not start with a simple ~, pass it to ! 212: zsysdep_local_file_cwd; as it happens, zsysdep_local_file_cwd ! 213: only uses the zpubdir argument if the file starts with a simple ! 214: ~, so it doesn't really matter what we pass for zpubdir. */ ! 215: if (zfile[0] != '~' ! 216: || (zfile[1] != '/' && zfile[1] != '\0')) ! 217: return zsysdep_local_file_cwd (zfile, (const char *) NULL); ! 218: ! 219: q = getpwuid (getuid ()); ! 220: if (q == NULL) ! 221: { ! 222: ulog (LOG_ERROR, "Can't get home directory"); ! 223: return NULL; ! 224: } ! 225: ! 226: if (zfile[1] == '\0') ! 227: return zbufcpy (q->pw_dir); ! 228: ! 229: return zsysdep_in_dir (q->pw_dir, zfile + 2); ! 230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.