|
|
1.1 ! root 1: /* recep.c ! 2: See whether a file has already been received. ! 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: #include "uudefs.h" ! 29: #include "uuconf.h" ! 30: #include "sysdep.h" ! 31: #include "system.h" ! 32: ! 33: #include <errno.h> ! 34: ! 35: #if HAVE_TIME_H ! 36: #include <time.h> ! 37: #endif ! 38: ! 39: #if HAVE_FCNTL_H ! 40: #include <fcntl.h> ! 41: #else ! 42: #if HAVE_SYS_FILE_H ! 43: #include <sys/file.h> ! 44: #endif ! 45: #endif ! 46: ! 47: static char *zsreceived_name P((const struct uuconf_system *qsys, ! 48: const char *ztemp)); ! 49: ! 50: /* These routines are used to see whether we have already received a ! 51: file in a previous UUCP connection. It is possible for the ! 52: acknowledgement of a received file to be lost. The sending system ! 53: will then now know that the file was correctly received, and will ! 54: send it again. This can be a problem particularly with protocols ! 55: which support channels, since they may send several small files in ! 56: a single window, all of which may be received correctly although ! 57: the sending system never sees the acknowledgement. If these files ! 58: involve an execution, the execution will happen twice, which will ! 59: be bad. ! 60: ! 61: We use a simple system. For each file we want to remember, we ! 62: create an empty file names .Received/SYS/TEMP, where SYS is the ! 63: name of the system and TEMP is the name of the temporary file used ! 64: by the sender. If no temporary file is used by the sender, we ! 65: don't remember that we received the file. This is not perfect, but ! 66: execution files will always have a temporary file, so the most ! 67: important case is handled. Also, any file received from Taylor ! 68: UUCP 1.04 or greater will always have a temporary file. */ ! 69: ! 70: /* Return the name we are going use for the marker, or NULL if we have ! 71: no name. */ ! 72: ! 73: static char * ! 74: zsreceived_name (qsys, ztemp) ! 75: const struct uuconf_system *qsys; ! 76: const char *ztemp; ! 77: { ! 78: if (ztemp != NULL ! 79: && *ztemp == 'D' ! 80: && strcmp (ztemp, "D.0") != 0) ! 81: return zsappend3 (".Received", qsys->uuconf_zname, ztemp); ! 82: else ! 83: return NULL; ! 84: } ! 85: ! 86: /* Remember that we have already received a file. */ ! 87: ! 88: /*ARGSUSED*/ ! 89: boolean ! 90: fsysdep_remember_reception (qsys, zto, ztemp) ! 91: const struct uuconf_system *qsys; ! 92: const char *zto; ! 93: const char *ztemp; ! 94: { ! 95: char *zfile; ! 96: int o; ! 97: ! 98: zfile = zsreceived_name (qsys, ztemp); ! 99: if (zfile == NULL) ! 100: return TRUE; ! 101: o = creat (zfile, IPUBLIC_FILE_MODE); ! 102: if (o < 0) ! 103: { ! 104: if (errno == ENOENT) ! 105: { ! 106: if (fsysdep_make_dirs (zfile, TRUE)) ! 107: { ! 108: ubuffree (zfile); ! 109: return FALSE; ! 110: } ! 111: o = creat (zfile, IPUBLIC_FILE_MODE); ! 112: } ! 113: if (o < 0) ! 114: { ! 115: ulog (LOG_ERROR, "creat (%s): %s", zfile, strerror (errno)); ! 116: ubuffree (zfile); ! 117: return FALSE; ! 118: } ! 119: } ! 120: ! 121: ubuffree (zfile); ! 122: ! 123: /* We don't have to actually put anything in the file; we just use ! 124: the name. This is more convenient than keeping a file with a ! 125: list of names. */ ! 126: if (close (o) < 0) ! 127: { ! 128: ulog (LOG_ERROR, "fsysdep_remember_reception: close: %s", ! 129: strerror (errno)); ! 130: return FALSE; ! 131: } ! 132: ! 133: return TRUE; ! 134: } ! 135: ! 136: /* See if we have already received a file. Note that don't delete the ! 137: marker file here, because we need to know that the sending system ! 138: has received our denial first. This function returns TRUE if the ! 139: file has already been received, FALSE if it has not. */ ! 140: ! 141: /*ARGSUSED*/ ! 142: boolean ! 143: fsysdep_already_received (qsys, zto, ztemp) ! 144: const struct uuconf_system *qsys; ! 145: const char *zto; ! 146: const char *ztemp; ! 147: { ! 148: char *zfile; ! 149: struct stat s; ! 150: boolean fret; ! 151: ! 152: zfile = zsreceived_name (qsys, ztemp); ! 153: if (zfile == NULL) ! 154: return FALSE; ! 155: if (stat (zfile, &s) < 0) ! 156: { ! 157: if (errno != ENOENT) ! 158: ulog (LOG_ERROR, "stat (%s): %s", zfile, strerror (errno)); ! 159: ubuffree (zfile); ! 160: return FALSE; ! 161: } ! 162: ! 163: /* Ignore the file (return FALSE) if it is over one week old. */ ! 164: fret = s.st_mtime + 7 * 24 * 60 * 60 >= time ((time_t *) NULL); ! 165: ! 166: if (fret) ! 167: DEBUG_MESSAGE1 (DEBUG_SPOOLDIR, "fsysdep_already_received: Found %s", ! 168: zfile); ! 169: ! 170: ubuffree (zfile); ! 171: ! 172: return fret; ! 173: } ! 174: ! 175: /* Forget that we have received a file. */ ! 176: ! 177: /*ARGSUSED*/ ! 178: boolean ! 179: fsysdep_forget_reception (qsys, zto, ztemp) ! 180: const struct uuconf_system *qsys; ! 181: const char *zto; ! 182: const char *ztemp; ! 183: { ! 184: char *zfile; ! 185: ! 186: zfile = zsreceived_name (qsys, ztemp); ! 187: if (zfile == NULL) ! 188: return TRUE; ! 189: if (remove (zfile) < 0 ! 190: && errno != ENOENT) ! 191: { ! 192: ulog (LOG_ERROR, "remove (%s): %s", zfile, strerror (errno)); ! 193: ubuffree (zfile); ! 194: return FALSE; ! 195: } ! 196: return TRUE; ! 197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.