|
|
1.1 ! root 1: /* spool.c ! 2: Find a file in the spool directory. ! 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: #if USE_RCS_ID ! 29: const char spool_rcsid[] = "$Id: spool.c,v 1.1 93/07/30 08:03:28 bin Exp Locker: bin $"; ! 30: #endif ! 31: ! 32: #include "uudefs.h" ! 33: #include "sysdep.h" ! 34: #include "system.h" ! 35: ! 36: /* There are several types of files that go in the spool directory, ! 37: and they go into various different subdirectories. Whenever the ! 38: system name LOCAL appears below, it means whatever the local system ! 39: name is. ! 40: ! 41: Command files ! 42: These contain instructions for uucico indicating what files to transfer ! 43: to and from what systems. Each line of a work file is a command ! 44: beginning with S, R or X. ! 45: #if ! SPOOLDIR_TAYLOR ! 46: They are named C.ssssssgqqqq, where ssssss is the system name to ! 47: transfer to or from, g is the grade and qqqq is the sequence number. ! 48: #if SPOOLDIR_V2 ! 49: They are put in the spool directory. ! 50: #elif SPOOLDIR_BSD42 || SPOOLDIR_BSD43 ! 51: They are put in the directory "C.". ! 52: #elif SPOOLDIR_HDB ! 53: They are put in a directory named for the system for which they were ! 54: created. ! 55: #elif SPOOLDIR_ULTRIX ! 56: If the directory sys/ssssss exists, they are put in the directory ! 57: sys/ssssss/C; otherwise, they are put in the directory sys/DEFAULT/C. ! 58: #endif ! 59: #elif SPOOLDIR_SVR4 ! 60: They are put in the directory sys/g, where sys is the system name ! 61: and g is the grade. ! 62: #endif ! 63: #else SPOOLDIR_TAYLOR ! 64: They are named C.gqqqq, where g is the grade and qqqq is the sequence ! 65: number, and are placed in the directory ssssss/C. where ssssss is ! 66: the system name to transfer to or from. ! 67: #endif ! 68: ! 69: Data files ! 70: There are files to be transferred to other systems. Some files to ! 71: be transferred may not be in the spool directory, depending on how ! 72: uucp was invoked. Data files are named in work files, so it is ! 73: never necessary to look at them directly (except to remove old ones); ! 74: it is only necessary to create them. These means that the many ! 75: variations in naming are inconsequential. ! 76: #if ! SPOOLDIR_TAYLOR ! 77: They are named D.ssssssgqqqq where ssssss is a system name (which ! 78: may be LOCAL for locally initiated transfers or a remote system for ! 79: remotely initiated transfers, except that HDB appears to use the ! 80: system the file is being transferred to), g is the grade and qqqq ! 81: is the sequence number. Some systems use a trailing subjob ID ! 82: number, but we currently do not. The grade is not important, and ! 83: some systems do not use it. If the data file is to become an ! 84: execution file on another system the grade (if present) will be ! 85: 'X'. Otherwise Ultrix appears to use 'b'; the uux included with ! 86: gnuucp 1.0 appears to use 'S'; SCO does not appear to use a grade, ! 87: although it does use a subjob ID number. ! 88: #if SPOOLDIR_V2 ! 89: They are put in the spool directory. ! 90: #elif SPOOLDIR_BSD42 ! 91: If the name begins with D.LOCAL, the file is put in the directory ! 92: D.LOCAL. Otherwise the file is put in the directory D.. ! 93: #elif SPOOLDIR_BSD43 ! 94: If the name begins with D.LOCALX, the file is put in the directory ! 95: D.LOCALX. Otherwise if the name begins with D.LOCAL, the file is ! 96: put in the directory D.LOCAL Otherwise the file is put in the ! 97: directory "D.". ! 98: #elif SPOOLDIR_HDB ! 99: They are put in a directory named for the system for which they ! 100: were created. ! 101: #elif SPOOLDIR_ULTRIX ! 102: Say the file is being transferred to system REMOTE. If the ! 103: directory sys/REMOTE exists, then if the file begins with D.LOCALX ! 104: it is put in sys/REMOTE/D.LOCALX, if the file begins with D.LOCAL ! 105: it is put in sys/REMOTE/D.LOCAL, and otherwise it is put in ! 106: "sys/REMOTE/D.". If the directory sys/REMOTE does not exist, the ! 107: same applies except that DEFAULT is used instead of REMOTE. ! 108: #elif SPOOLDIR_SVR4 ! 109: They are put in the directory sys/g, where sys is the system name ! 110: and g is the grade. ! 111: #endif ! 112: #else SPOOLDIR_TAYLOR ! 113: If the file is to become an executable file on another system it is ! 114: named D.Xqqqq, otherwise it is named D.qqqq where in both cases ! 115: qqqq is a sequence number. If the corresponding C. file is in ! 116: directory ssssss/C., a D.X file is placed in ssssss/D.X and a D. ! 117: file is placed in "ssssss/D.". ! 118: #endif ! 119: ! 120: Execute files ! 121: These are files that specify programs to be executed. They are ! 122: created by uux, perhaps as run on another system. These names are ! 123: important, because a file transfer done to an execute file name ! 124: causes an execution to occur. The name is X.ssssssgqqqq, where ! 125: ssssss is the requesting system, g is the grade, and qqqq is a ! 126: sequence number. ! 127: #if SPOOLDIR_V2 || SPOOLDIR_BSD42 ! 128: These files are placed in the spool directory. ! 129: #elif SPOOLDIR_BSD43 ! 130: These files are placed in the directory X.. ! 131: #elif SPOOLDIR_HDB || SPOOLDIR_SVR4 ! 132: These files are put in a directory named for the system for which ! 133: the files were created. ! 134: #elif SPOOLDIR_ULTRIX ! 135: If there is a spool directory (sys/ssssss) for the requesting ! 136: system, the files are placed in sys/ssssss/X.; otherwise, the files ! 137: are placed in "sys/DEFAULT/X.". ! 138: #elif SPOOLDIR_TAYLOR ! 139: The system name is automatically truncated to seven characters when ! 140: a file is created. The files are placed in the subdirectory X. of ! 141: a directory named for the system for which the files were created. ! 142: #endif ! 143: ! 144: Temporary receive files ! 145: These are used when receiving files from another system. They are ! 146: later renamed to the final name. The actual name is unimportant, ! 147: although it generally begins with TM.. ! 148: #if SPOOLDIR_V2 || SPOOLDIR_BSD42 ! 149: These files are placed in the spool directory. ! 150: #elif SPOOLDIR_BSD43 || SPOOLDIR_ULTRIX || SPOOLDIR_TAYLOR ! 151: These files are placed in the directory .Temp. ! 152: #elif SPOOLDIR_HDB || SPOOLDIR_SVR4 ! 153: These files are placed in a directory named for the system for ! 154: which they were created. ! 155: #endif ! 156: ! 157: System status files ! 158: These are used to record when the last call was made to the system ! 159: and what the status is. They are used to prevent frequent recalls ! 160: to a system which is not responding. I will not attempt to ! 161: recreate the format of these exactly, since they are not all that ! 162: important. They will be put in the directory .Status, as in HDB, ! 163: and they use the system name as the name of the file. ! 164: ! 165: Sequence file ! 166: This is used to generate a unique sequence number. It contains an ! 167: ASCII number. ! 168: #if SPOOLDIR_V2 || SPOOLDIR_BSD42 || SPOOLDIR_BSD43 ! 169: The file is named SEQF and is kept in the spool directory. ! 170: #elif SPOOLDIR_HDB || SPOOLDIR_SVR4 ! 171: A separate sequence file is kept for each system in the directory ! 172: .Sequence with the name of the system. ! 173: #elif SPOOLDIR_ULTRIX ! 174: Each system with a file sys/ssssss has a sequence file in ! 175: sys/ssssss/.SEQF. Other systems use sys/DEFAULT/.SEQF. ! 176: #else SPOOLDIR_TAYLOR ! 177: A sequence file named SEQF is kept in the directory ssssss for each ! 178: system. ! 179: #endif ! 180: */ ! 181: ! 182: /* Given the name of a file as specified in a UUCP command, and the ! 183: system for which this file has been created, return where to find ! 184: it in the spool directory. The file will begin with C. (a command ! 185: file), D. (a data file) or X. (an execution file). Under ! 186: SPOOLDIR_SVR4 we need to know the grade of the file created by the ! 187: local system; this is the bgrade argument, which is -1 for a file ! 188: from a remote system. */ ! 189: ! 190: /*ARGSUSED*/ ! 191: char * ! 192: zsfind_file (zsimple, zsystem, bgrade) ! 193: const char *zsimple; ! 194: const char *zsystem; ! 195: int bgrade; ! 196: { ! 197: if (! fspool_file (zsimple)) ! 198: { ! 199: ulog (LOG_ERROR, "Unrecognized file name %s", zsimple); ! 200: return NULL; ! 201: } ! 202: ! 203: #if ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 && ! SPOOLDIR_TAYLOR ! 204: if (*zsimple == 'X') ! 205: { ! 206: size_t clen; ! 207: ! 208: /* Files beginning with X. are execute files. It is important ! 209: for security reasons that we know the system which created ! 210: the X. file. This is easy under SPOOLDIR_HDB or ! 211: SPOOLDIR_SVR4 SPOOLDIR_TAYLOR, because the file will be in a ! 212: directory named for the system. Under other schemes, we must ! 213: get the system name from the X. file name. To prevent ! 214: security violations, we set the system name directly here; ! 215: this will cause problems if the maximum file name length is ! 216: too short, but hopefully no problem will occur since any ! 217: System V systems will be using HDB or SVR4 or TAYLOR. */ ! 218: clen = strlen (zsimple); ! 219: if (clen <= 7 || strncmp (zsimple + 2, zsystem, clen - 7) != 0) ! 220: { ! 221: static char *zbuf; ! 222: static size_t cbuf; ! 223: size_t cwant; ! 224: ! 225: cwant = strlen (zsystem) + 8; ! 226: if (cwant > cbuf) ! 227: { ! 228: zbuf = (char *) xrealloc ((pointer) zbuf, cwant); ! 229: cbuf = cwant; ! 230: } ! 231: sprintf (zbuf, "X.%s%s", zsystem, ! 232: clen < 5 ? zsimple : zsimple + clen - 5); ! 233: zsimple = zbuf; ! 234: } ! 235: } ! 236: #endif /* ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 && ! SPOOLDIR_TAYLOR */ ! 237: ! 238: #if SPOOLDIR_V2 ! 239: /* V2 never uses subdirectories. */ ! 240: return zbufcpy (zsimple); ! 241: #endif /* SPOOLDIR_V2 */ ! 242: ! 243: #if SPOOLDIR_HDB ! 244: /* HDB always uses the system name as a directory. */ ! 245: return zsysdep_in_dir (zsystem, zsimple); ! 246: #endif /* SPOOLDIR_HDB */ ! 247: ! 248: #if SPOOLDIR_SVR4 ! 249: /* SVR4 uses grade directories within the system directory for local ! 250: command and data files. */ ! 251: if (bgrade < 0 || *zsimple == 'X') ! 252: return zsysdep_in_dir (zsystem, zsimple); ! 253: else ! 254: { ! 255: char abgrade[2]; ! 256: ! 257: abgrade[0] = bgrade; ! 258: abgrade[1] = '\0'; ! 259: return zsappend3 (zsystem, abgrade, zsimple); ! 260: } ! 261: #endif /* SPOOLDIR_SVR4 */ ! 262: ! 263: #if ! SPOOLDIR_V2 && ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 ! 264: switch (*zsimple) ! 265: { ! 266: case 'C': ! 267: #if SPOOLDIR_BSD42 || SPOOLDIR_BSD43 ! 268: return zsysdep_in_dir ("C.", zsimple); ! 269: #endif /* SPOOLDIR_BSD42 || SPOOLDIR_BSD43 */ ! 270: #if SPOOLDIR_ULTRIX ! 271: if (fsultrix_has_spool (zsystem)) ! 272: return zsappend4 ("sys", zsystem, "C.", zsimple); ! 273: else ! 274: return zsappend4 ("sys", "DEFAULT", "C.", zsimple); ! 275: #endif /* SPOOLDIR_ULTRIX */ ! 276: #if SPOOLDIR_TAYLOR ! 277: return zsappend3 (zsystem, "C.", zsimple); ! 278: #endif /* SPOOLDIR_TAYLOR */ ! 279: ! 280: case 'D': ! 281: #if SPOOLDIR_BSD42 || SPOOLDIR_BSD43 ! 282: { ! 283: size_t c; ! 284: boolean ftruncated; ! 285: ! 286: /* D.LOCAL in D.LOCAL/, others in D./. If BSD43, D.LOCALX in ! 287: D.LOCALX/. */ ! 288: ftruncated = TRUE; ! 289: if (strncmp (zsimple + 2, zSlocalname, strlen (zSlocalname)) == 0) ! 290: { ! 291: c = strlen (zSlocalname); ! 292: ftruncated = FALSE; ! 293: } ! 294: else if (strncmp (zsimple + 2, zSlocalname, 7) == 0) ! 295: c = 7; ! 296: else if (strncmp (zsimple + 2, zSlocalname, 6) == 0) ! 297: c = 6; ! 298: else ! 299: c = 0; ! 300: #if SPOOLDIR_BSD43 ! 301: if (c > 0 && zsimple[c + 2] == 'X') ! 302: c++; ! 303: #endif /* SPOOLDIR_BSD43 */ ! 304: if (c > 0) ! 305: { ! 306: char *zalloc; ! 307: ! 308: zalloc = zbufalc (c + 3); ! 309: memcpy (zalloc, zsimple, c + 2); ! 310: zalloc[c + 2] = '\0'; ! 311: ! 312: /* If we truncated the system name, and there is no existing ! 313: directory with the truncated name, then just use D.. */ ! 314: if (! ftruncated || fsysdep_directory (zalloc)) ! 315: { ! 316: char *zret; ! 317: ! 318: zret = zsysdep_in_dir (zalloc, zsimple); ! 319: ubuffree (zalloc); ! 320: return zret; ! 321: } ! 322: ubuffree (zalloc); ! 323: } ! 324: return zsysdep_in_dir ("D.", zsimple); ! 325: } ! 326: #endif /* SPOOLDIR_BSD42 || SPOOLDIR_BSD43 */ ! 327: #if SPOOLDIR_ULTRIX ! 328: { ! 329: size_t c; ! 330: boolean ftruncated; ! 331: char *zfree; ! 332: const char *zdir; ! 333: char *zret; ! 334: ! 335: /* D.LOCALX in D.LOCALX/, D.LOCAL in D.LOCAL/, others in D./. */ ! 336: ftruncated = TRUE; ! 337: if (strncmp (zsimple + 2, zSlocalname, strlen (zSlocalname)) == 0) ! 338: { ! 339: c = strlen (zSlocalname); ! 340: ftruncated = FALSE; ! 341: } ! 342: else if (strncmp (zsimple + 2, zSlocalname, 7) == 0) ! 343: c = 7; ! 344: else if (strncmp (zsimple + 2, zSlocalname, 6) == 0) ! 345: c = 6; ! 346: else ! 347: c = 0; ! 348: if (c > 0 && zsimple[c + 2] == 'X') ! 349: ++c; ! 350: if (c > 0) ! 351: { ! 352: zfree = zbufalc (c + 3); ! 353: memcpy (zfree, zsimple, c + 2); ! 354: zfree[c + 2] = '\0'; ! 355: zdir = zfree; ! 356: ! 357: /* If we truncated the name, and there is no directory for ! 358: the truncated name, then don't use it. */ ! 359: if (ftruncated) ! 360: { ! 361: char *zlook; ! 362: ! 363: zlook = zsappend3 ("sys", ! 364: (fsultrix_has_spool (zsystem) ! 365: ? zsystem ! 366: : "DEFAULT"), ! 367: zdir); ! 368: if (! fsysdep_directory (zlook)) ! 369: zdir = "D."; ! 370: ubuffree (zlook); ! 371: } ! 372: } ! 373: else ! 374: { ! 375: zfree = NULL; ! 376: zdir = "D."; ! 377: } ! 378: ! 379: zret = zsappend4 ("sys", ! 380: (fsultrix_has_spool (zsystem) ! 381: ? zsystem ! 382: : "DEFAULT"), ! 383: zdir, ! 384: zsimple); ! 385: ubuffree (zfree); ! 386: return zret; ! 387: } ! 388: #endif /* SPOOLDIR_ULTRIX */ ! 389: #if SPOOLDIR_TAYLOR ! 390: if (zsimple[2] == 'X') ! 391: return zsappend3 (zsystem, "D.X", zsimple); ! 392: else ! 393: return zsappend3 (zsystem, "D.", zsimple); ! 394: #endif /* SPOOLDIR_TAYLOR */ ! 395: ! 396: ! 397: case 'X': ! 398: #if SPOOLDIR_BSD42 ! 399: return zbufcpy (zsimple); ! 400: #endif ! 401: #if SPOOLDIR_BSD43 ! 402: return zsysdep_in_dir ("X.", zsimple); ! 403: #endif ! 404: #if SPOOLDIR_ULTRIX ! 405: return zsappend4 ("sys", ! 406: (fsultrix_has_spool (zsystem) ! 407: ? zsystem ! 408: : "DEFAULT"), ! 409: "X.", ! 410: zsimple); ! 411: #endif ! 412: #if SPOOLDIR_TAYLOR ! 413: return zsappend3 (zsystem, "X.", zsimple); ! 414: #endif ! 415: } ! 416: ! 417: /* This is just to avoid warnings; it will never be executed. */ ! 418: return NULL; ! 419: #endif /* ! SPOOLDIR_V2 && ! SPOOLDIR_HDB && ! SPOOLDIR_SVR4 */ ! 420: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.