|
|
1.1 ! root 1: /* uudefs.h ! 2: Miscellaneous definitions for the UUCP package. ! 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: #if ANSI_C ! 27: /* These structures are used in prototypes but are not defined in this ! 28: header file. */ ! 29: struct uuconf_system; ! 30: struct uuconf_timespan; ! 31: #endif ! 32: ! 33: /* The tlog enumeration holds the different types of logging. */ ! 34: enum tlog ! 35: { ! 36: /* Normal log entry. */ ! 37: LOG_NORMAL, ! 38: /* Error log entry. */ ! 39: LOG_ERROR, ! 40: /* Fatal log entry. */ ! 41: LOG_FATAL ! 42: #if DEBUG > 1 ! 43: , ! 44: /* Debugging log entry. */ ! 45: LOG_DEBUG, ! 46: /* Start debugging log entry. */ ! 47: LOG_DEBUG_START, ! 48: /* Continue debugging log entry. */ ! 49: LOG_DEBUG_CONTINUE, ! 50: /* End debugging log entry. */ ! 51: LOG_DEBUG_END ! 52: #endif ! 53: }; ! 54: ! 55: /* The tstatus_type enumeration holds the kinds of status information ! 56: we put in the status file. The order of entries here corresponds ! 57: to the order of entries in the azStatus array. */ ! 58: enum tstatus_type ! 59: { ! 60: /* Conversation complete. */ ! 61: STATUS_COMPLETE, ! 62: /* Port unavailable. */ ! 63: STATUS_PORT_FAILED, ! 64: /* Dial failed. */ ! 65: STATUS_DIAL_FAILED, ! 66: /* Login failed. */ ! 67: STATUS_LOGIN_FAILED, ! 68: /* Handshake failed. */ ! 69: STATUS_HANDSHAKE_FAILED, ! 70: /* Failed after logging in. */ ! 71: STATUS_FAILED, ! 72: /* Talking to remote system. */ ! 73: STATUS_TALKING, ! 74: /* Wrong time to call. */ ! 75: STATUS_WRONG_TIME, ! 76: /* Number of status values. */ ! 77: STATUS_VALUES ! 78: }; ! 79: ! 80: /* An array to convert status entries to strings. If more status entries ! 81: are added, this array must be extended. */ ! 82: extern const char *azStatus[]; ! 83: ! 84: /* The sstatus structure holds the contents of a system status file. */ ! 85: struct sstatus ! 86: { ! 87: /* Current status of conversation. */ ! 88: enum tstatus_type ttype; ! 89: /* Number of failed retries. */ ! 90: int cretries; ! 91: /* Time of last call in seconds since epoch (determined by ! 92: ixsysdep_time). */ ! 93: long ilast; ! 94: /* Number of seconds until a retry is permitted. */ ! 95: int cwait; ! 96: }; ! 97: ! 98: /* How long we have to wait for the next call, given the number of retries ! 99: we have already made. This should probably be configurable. */ ! 100: #define CRETRY_WAIT(c) ((c) * 10 * 60) ! 101: ! 102: /* The scmd structure holds a complete UUCP command. */ ! 103: struct scmd ! 104: { ! 105: /* Command ('S' for send, 'R' for receive, 'X' for execute, 'E' for ! 106: simple execution, 'H' for hangup, 'Y' for hangup confirm, 'N' for ! 107: hangup deny). */ ! 108: char bcmd; ! 109: /* At least one compiler needs an explicit padding byte here. */ ! 110: char bdummy; ! 111: /* Sequence handle for fsysdep_did_work. */ ! 112: pointer pseq; ! 113: /* File name to transfer from. */ ! 114: const char *zfrom; ! 115: /* File name to transfer to. */ ! 116: const char *zto; ! 117: /* User who requested transfer. */ ! 118: const char *zuser; ! 119: /* Options. */ ! 120: const char *zoptions; ! 121: /* Temporary file name ('S' and 'E'). */ ! 122: const char *ztemp; ! 123: /* Mode to give newly created file ('S' and 'E'). */ ! 124: unsigned int imode; ! 125: /* User to notify on remote system (optional; 'S' and 'E'). */ ! 126: const char *znotify; ! 127: /* File size (-1 if not supplied) ('S', 'E' and 'R'). */ ! 128: long cbytes; ! 129: /* Command to execute ('E'). */ ! 130: const char *zcmd; ! 131: /* Position to restart from ('R'). */ ! 132: long ipos; ! 133: }; ! 134: ! 135: #if DEBUG > 1 ! 136: ! 137: /* We allow independent control over several different types of ! 138: debugging output, using a bit string with individual bits dedicated ! 139: to particular debugging types. */ ! 140: ! 141: /* The bit string is stored in iDebug. */ ! 142: extern int iDebug; ! 143: ! 144: /* Debug abnormal events. */ ! 145: #define DEBUG_ABNORMAL (01) ! 146: /* Debug chat scripts. */ ! 147: #define DEBUG_CHAT (02) ! 148: /* Debug initial handshake. */ ! 149: #define DEBUG_HANDSHAKE (04) ! 150: /* Debug UUCP protocol. */ ! 151: #define DEBUG_UUCP_PROTO (010) ! 152: /* Debug protocols. */ ! 153: #define DEBUG_PROTO (020) ! 154: /* Debug port actions. */ ! 155: #define DEBUG_PORT (040) ! 156: /* Debug configuration files. */ ! 157: #define DEBUG_CONFIG (0100) ! 158: /* Debug spool directory actions. */ ! 159: #define DEBUG_SPOOLDIR (0200) ! 160: /* Debug executions. */ ! 161: #define DEBUG_EXECUTE (0400) ! 162: /* Debug incoming data. */ ! 163: #define DEBUG_INCOMING (01000) ! 164: /* Debug outgoing data. */ ! 165: #define DEBUG_OUTGOING (02000) ! 166: ! 167: /* Maximum possible value for iDebug. */ ! 168: #define DEBUG_MAX (03777) ! 169: ! 170: /* Intializer for array of debug names. The index of the name in the ! 171: array is the corresponding bit position in iDebug. We only check ! 172: for prefixes, so these names only need to be long enough to ! 173: distinguish each name from every other. The last entry must be ! 174: NULL. The string "all" is also recognized to turn on all ! 175: debugging. */ ! 176: #define DEBUG_NAMES \ ! 177: { "a", "ch", "h", "u", "pr", "po", "co", "s", "e", "i", "o", NULL } ! 178: ! 179: /* The prefix to use to turn off all debugging. */ ! 180: #define DEBUG_NONE "n" ! 181: ! 182: /* Check whether a particular type of debugging is being done. */ ! 183: #define FDEBUGGING(i) ((iDebug & (i)) != 0) ! 184: ! 185: /* These macros are used to output debugging information. I use ! 186: several different macros depending on the number of arguments ! 187: because no macro can take a variable number of arguments and I ! 188: don't want to use double parentheses. */ ! 189: #define DEBUG_MESSAGE0(i, z) \ ! 190: do { if (FDEBUGGING (i)) ulog (LOG_DEBUG, (z)); } while (0) ! 191: #define DEBUG_MESSAGE1(i, z, a1) \ ! 192: do { if (FDEBUGGING (i)) ulog (LOG_DEBUG, (z), (a1)); } while (0) ! 193: #define DEBUG_MESSAGE2(i, z, a1, a2) \ ! 194: do { if (FDEBUGGING (i)) ulog (LOG_DEBUG, (z), (a1), (a2)); } while (0) ! 195: #define DEBUG_MESSAGE3(i, z, a1, a2, a3) \ ! 196: do \ ! 197: { \ ! 198: if (FDEBUGGING (i)) \ ! 199: ulog (LOG_DEBUG, (z), (a1), (a2), (a3)); \ ! 200: } \ ! 201: while (0) ! 202: #define DEBUG_MESSAGE4(i, z, a1, a2, a3, a4) \ ! 203: do \ ! 204: { \ ! 205: if (FDEBUGGING (i)) \ ! 206: ulog (LOG_DEBUG, (z), (a1), (a2), (a3), (a4)); \ ! 207: } \ ! 208: while (0) ! 209: ! 210: #else /* DEBUG <= 1 */ ! 211: ! 212: /* If debugging information is not being compiled, provide versions of ! 213: the debugging macros which just disappear. */ ! 214: #define DEBUG_MESSAGE0(i, z) ! 215: #define DEBUG_MESSAGE1(i, z, a1) ! 216: #define DEBUG_MESSAGE2(i, z, a1, a2) ! 217: #define DEBUG_MESSAGE3(i, z, a1, a2, a3) ! 218: #define DEBUG_MESSAGE4(i, z, a1, a2, a3, a4) ! 219: ! 220: #endif /* DEBUG <= 1 */ ! 221: ! 222: /* Functions. */ ! 223: ! 224: /* Given an unknown system name, return information for an unknown ! 225: system. If unknown systems are not permitted, this returns FALSE. ! 226: Otherwise, it translates the name as necessary for the spool ! 227: directory, and fills in *qsys. */ ! 228: extern boolean funknown_system P((pointer puuconf, const char *zsystem, ! 229: struct uuconf_system *qsys)); ! 230: ! 231: /* See whether a file belongs in the spool directory. */ ! 232: extern boolean fspool_file P((const char *zfile)); ! 233: ! 234: /* See if the current time matches a time span. If not, return FALSE. ! 235: Otherwise, return TRUE and set *pival and *pcretry to the values ! 236: from the matching element of the span. */ ! 237: extern boolean ftimespan_match P((const struct uuconf_timespan *qspan, ! 238: long *pival, int *pcretry)); ! 239: ! 240: /* Determine the maximum size that may ever be transferred, given a ! 241: timesize span. If there are any time gaps larger than 1 hour not ! 242: described by the timesize span, this returns -1. Otherwise it ! 243: returns the largest size that may be transferred at some time. */ ! 244: extern long cmax_size_ever P((const struct uuconf_timespan *qtimesize)); ! 245: ! 246: /* Send mail about a file transfer. */ ! 247: extern boolean fmail_transfer P((boolean fok, const char *zuser, ! 248: const char *zmail, const char *zwhy, ! 249: const char *zfrom, const char *zfromsys, ! 250: const char *zto, const char *ztosys, ! 251: const char *zsaved)); ! 252: ! 253: /* See whether a file is in one of a list of directories. The zpubdir ! 254: argument is used to pass the directory names to zsysdep_local_file. ! 255: If fcheck is FALSE, this does not check accessibility. Otherwise, ! 256: if freadable is TRUE, the user zuser must have read access to the ! 257: file and all appropriate directories; if freadable is FALSE zuser ! 258: must have write access to the appropriate directories. The zuser ! 259: argument may be NULL, in which case all users must have the ! 260: appropriate access (this is used for a remote request). */ ! 261: extern boolean fin_directory_list P((const char *zfile, ! 262: char **pzdirs, ! 263: const char *zpubdir, ! 264: boolean fcheck, ! 265: boolean freadable, ! 266: const char *zuser)); ! 267: ! 268: /* Parse a command string. */ ! 269: extern boolean fparse_cmd P((char *zcmd, struct scmd *qcmd)); ! 270: ! 271: /* Make a log entry. */ ! 272: #ifdef __GNUC__ ! 273: #define GNUC_VERSION __GNUC__ ! 274: #else ! 275: #define GNUC_VERSION 0 ! 276: #endif ! 277: ! 278: #if ANSI_C && HAVE_VFPRINTF ! 279: extern void ulog P((enum tlog ttype, const char *zfmt, ...)) ! 280: #if GNUC_VERSION > 1 ! 281: __attribute__ ((format (printf, 2, 3))) ! 282: #endif ! 283: ; ! 284: #else ! 285: extern void ulog (); ! 286: #endif ! 287: ! 288: #undef GNUC_VERSION ! 289: ! 290: /* Report an error returned by one of the uuconf routines. */ ! 291: extern void ulog_uuconf P((enum tlog ttype, pointer puuconf, ! 292: int iuuconf)); ! 293: ! 294: /* Set the function to call if a fatal error occurs. */ ! 295: extern void ulog_fatal_fn P((void (*pfn) P((void)))); ! 296: ! 297: /* If ffile is TRUE, send log entries to the log file rather than to ! 298: stderr. */ ! 299: extern void ulog_to_file P((pointer puuconf, boolean ffile)); ! 300: ! 301: /* Set the ID number used by the logging functions. */ ! 302: extern void ulog_id P((int iid)); ! 303: ! 304: /* Set the system name used by the logging functions. */ ! 305: extern void ulog_system P((const char *zsystem)); ! 306: ! 307: /* Set the system and user name used by the logging functions. */ ! 308: extern void ulog_user P((const char *zuser)); ! 309: ! 310: /* Set the device name used by the logging functions. */ ! 311: extern void ulog_device P((const char *zdevice)); ! 312: ! 313: /* Close the log file. */ ! 314: extern void ulog_close P((void)); ! 315: ! 316: /* Make an entry in the statistics file. */ ! 317: extern void ustats P((boolean fsucceeded, const char *zuser, ! 318: const char *zsystem, boolean fsent, ! 319: long cbytes, long csecs, long cmicros, ! 320: boolean fmaster)); ! 321: ! 322: /* Close the statistics file. */ ! 323: extern void ustats_close P((void)); ! 324: ! 325: #if DEBUG > 1 ! 326: /* A debugging routine to output a buffer. This outputs zhdr, the ! 327: buffer length clen, and the contents of the buffer in quotation ! 328: marks. */ ! 329: extern void udebug_buffer P((const char *zhdr, const char *zbuf, ! 330: size_t clen)); ! 331: ! 332: /* A debugging routine to make a readable version of a character. ! 333: This takes a buffer at least 5 bytes long, and returns the length ! 334: of the string it put into it (not counting the null byte). */ ! 335: extern size_t cdebug_char P((char *z, int ichar)); ! 336: ! 337: /* Parse a debugging option string. This can either be a number or a ! 338: comma separated list of debugging names. This returns a value for ! 339: iDebug. */ ! 340: extern int idebug_parse P((const char *)); ! 341: ! 342: #endif /* DEBUG <= 1 */ ! 343: ! 344: /* Copy one file to another. */ ! 345: extern boolean fcopy_file P((const char *zfrom, const char *zto, ! 346: boolean fpublic, boolean fmkdirs)); ! 347: ! 348: /* Copy an open file to another. */ ! 349: extern boolean fcopy_open_file P((openfile_t efrom, const char *zto, ! 350: boolean fpublic, boolean fmkdirs)); ! 351: ! 352: /* Translate escape sequences in a buffer, leaving the result in the ! 353: same buffer and returning the length. */ ! 354: extern size_t cescape P((char *zbuf)); ! 355: ! 356: /* Get a buffer to hold a string of a given size. The buffer should ! 357: be freed with ubuffree. */ ! 358: extern char *zbufalc P((size_t csize)); ! 359: ! 360: /* Call zbufalc to allocate a buffer and copy a string into it. */ ! 361: extern char *zbufcpy P((const char *z)); ! 362: ! 363: /* Free up a buffer returned by zbufalc or zbufcpy. */ ! 364: extern void ubuffree P((char *z)); ! 365: ! 366: /* Allocate memory without fail. */ ! 367: extern pointer xmalloc P((size_t)); ! 368: ! 369: /* Realloc memory without fail. */ ! 370: extern pointer xrealloc P((pointer, size_t)); ! 371: ! 372: /* Free memory (accepts NULL pointers, which some libraries erroneously ! 373: do not). */ ! 374: extern void xfree P((pointer)); ! 375: ! 376: /* Global variables. */ ! 377: ! 378: /* The name of the program being run. This is statically initialized, ! 379: although it should perhaps be set from argv[0]. */ ! 380: extern char abProgram[]; ! 381: ! 382: /* When a signal occurs, the signal handlers sets the appropriate ! 383: element of the arrays afSignal and afLog_signal to TRUE. The ! 384: afSignal array is used to check whether a signal occurred. The ! 385: afLog_signal array tells ulog to log the signal; ulog will clear ! 386: the element after logging it, which means that if a signal comes in ! 387: at just the right moment it will not be logged. It will always be ! 388: recorded in afSignal, though. At the moment we handle 5 signals: ! 389: SIGHUP, SIGINT, SIGQUIT, SIGTERM and SIGPIPE (the Unix code also ! 390: handles SIGALRM). If we want to handle more, the afSignal array ! 391: must be extended; I see little point to handling any of the other ! 392: ANSI C or POSIX signals, as they are either unlikely to occur ! 393: (SIGABRT, SIGUSR1) or nearly impossible to handle cleanly (SIGILL, ! 394: SIGSEGV). SIGHUP is only logged if fLog_sighup is TRUE. */ ! 395: #define INDEXSIG_SIGHUP (0) ! 396: #define INDEXSIG_SIGINT (1) ! 397: #define INDEXSIG_SIGQUIT (2) ! 398: #define INDEXSIG_SIGTERM (3) ! 399: #define INDEXSIG_SIGPIPE (4) ! 400: #define INDEXSIG_COUNT (5) ! 401: ! 402: extern volatile sig_atomic_t afSignal[INDEXSIG_COUNT]; ! 403: extern volatile sig_atomic_t afLog_signal[INDEXSIG_COUNT]; ! 404: extern boolean fLog_sighup; ! 405: ! 406: /* The names of the signals to use in error messages, as an ! 407: initializer for an array. */ ! 408: #define INDEXSIG_NAMES \ ! 409: { "hangup", "interrupt", "quit", "termination", "SIGPIPE" } ! 410: ! 411: /* Check to see whether we've received a signal. It would be nice if ! 412: we could use a single variable for this, but we sometimes want to ! 413: clear our knowledge of a signal and that would cause race ! 414: conditions (clearing a single element of the array is not a race ! 415: assuming that we don't care about a particular signal, even if it ! 416: occurs after we've examined the array). */ ! 417: #define FGOT_SIGNAL() \ ! 418: (afSignal[INDEXSIG_SIGHUP] || afSignal[INDEXSIG_SIGINT] \ ! 419: || afSignal[INDEXSIG_SIGQUIT] || afSignal[INDEXSIG_SIGTERM] \ ! 420: || afSignal[INDEXSIG_SIGPIPE]) ! 421: ! 422: /* If we get a SIGINT in uucico, we continue the current communication ! 423: session but don't start any new ones. This macros checks for any ! 424: signal other than SIGINT, which means we should get out ! 425: immediately. */ ! 426: #define FGOT_QUIT_SIGNAL() \ ! 427: (afSignal[INDEXSIG_SIGHUP] || afSignal[INDEXSIG_SIGQUIT] \ ! 428: || afSignal[INDEXSIG_SIGTERM] || afSignal[INDEXSIG_SIGPIPE]) ! 429: ! 430: /* File being sent. */ ! 431: extern openfile_t eSendfile; ! 432: ! 433: /* File being received. */ ! 434: extern openfile_t eRecfile; ! 435: ! 436: /* Device name to log. This is set by fconn_open. It may be NULL. */ ! 437: extern char *zLdevice; ! 438: ! 439: /* If not NULL, ulog calls this function before outputting anything. ! 440: This is used to support cu. */ ! 441: extern void (*pfLstart) P((void)); ! 442: ! 443: /* If not NULL, ulog calls this function after outputting everything. ! 444: This is used to support cu. */ ! 445: extern void (*pfLend) P((void));
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.