|
|
1.1 ! root 1: #include "parms.h" ! 2: ! 3: #ifdef BSD4_2 ! 4: #define V7 ! 5: #undef NONAP ! 6: #undef FASTTIMER ! 7: #endif ! 8: ! 9: #ifdef FASTTIMER ! 10: #undef NONAP ! 11: #endif ! 12: ! 13: #ifdef V8 ! 14: #define V7 ! 15: #endif V8 ! 16: ! 17: #include <stdio.h> ! 18: #include <ctype.h> ! 19: #include <setjmp.h> ! 20: #include <sys/param.h> ! 21: ! 22: #if defined (ATTSV) && ! defined (CDLIMIT) ! 23: #include <sys/fmgr.h> ! 24: #endif ! 25: ! 26: /* ! 27: * param.h includes types.h and signal.h in 4bsd ! 28: */ ! 29: #ifdef V7 ! 30: #include <sys/timeb.h> ! 31: #else ! 32: #include <termio.h> ! 33: #include <sys/types.h> ! 34: #include <signal.h> ! 35: #include <fcntl.h> ! 36: #endif ! 37: ! 38: #include <sys/stat.h> ! 39: #ifdef READDIR ! 40: #include <ndir.h> ! 41: #endif ! 42: #ifdef V8 ! 43: #define V8DIRSIZ 14 /* to truncate, to make legal filenames */ ! 44: #endif ! 45: ! 46: #ifdef BSD4_2 ! 47: #include <sys/time.h> ! 48: #else ! 49: #include <time.h> ! 50: #endif ! 51: ! 52: #include <sys/times.h> ! 53: #include <errno.h> ! 54: ! 55: #ifdef ATTSV ! 56: #include <sys/sysmacros.h> ! 57: #endif ATTSV ! 58: ! 59: #ifdef RT ! 60: #include "rt/types.h" ! 61: #include "rt/unix/param.h" ! 62: #include "rt/stat.h" ! 63: #include <sys/ustat.h> ! 64: #endif RT ! 65: ! 66: /* what mode should D. files have upon creation? */ ! 67: #define DFILEMODE 0600 ! 68: ! 69: /* what mode should C. files have upon creation? */ ! 70: #define CFILEMODE 0644 ! 71: ! 72: /* define the value of DIRMASK, for umask call */ ! 73: /* used for creating system subdirectories */ ! 74: #define DIRMASK 0022 ! 75: ! 76: #define MAXSTART 300 /* how long to wait on startup */ ! 77: ! 78: /* define the last characters for ACU (used for 801/212 dialers) */ ! 79: #define ACULAST "<" ! 80: ! 81: /* caution - the fillowing names are also in Makefile ! 82: * any changes here have to also be made there ! 83: * ! 84: * it's a good idea to make directories .foo, since this ensures ! 85: * that they'll be ignored by processes that search subdirectories in SPOOL ! 86: * ! 87: * XQTDIR=/usr/spool/uucp/.Xqtdir ! 88: * CORRUPT=/usr/spool/uucp/.Corrupt ! 89: * LOGDIR=/usr/spool/uucp/.Log ! 90: * SEQDIR=/usr/spool/uucp/.Sequence ! 91: * STATDIR=/usr/spool/uucp/.Status ! 92: * ! 93: */ ! 94: ! 95: /* where to put the STST. files? */ ! 96: #define STATDIR "/usr/spool/uucp/.Status" ! 97: ! 98: /* where should logfiles be kept? */ ! 99: #define LOGUUX "/usr/spool/uucp/.Log/uux" ! 100: #define LOGUUXQT "/usr/spool/uucp/.Log/uuxqt" ! 101: #define LOGUUCP "/usr/spool/uucp/.Log/uucp" ! 102: #define LOGCICO "/usr/spool/uucp/.Log/uucico" ! 103: #define CORRUPTDIR "/usr/spool/uucp/.Corrupt" ! 104: ! 105: /* some sites use /usr/lib/uucp/.XQTDIR here */ ! 106: /* use caution since things are linked into there */ ! 107: #define XQTDIR "/usr/spool/uucp/.Xqtdir" ! 108: ! 109: /* how much of a system name can we print in a [CX]. file? */ ! 110: /* MAXBASENAME - 1 (pre) - 1 ('.') - 1 (grade) - 4 (sequence number) */ ! 111: #define SYSNSIZE (MAXBASENAME - 7) ! 112: ! 113: #ifdef USRSPOOLLOCKS ! 114: #define LOCKPRE "/usr/spool/locks/LCK." ! 115: #else ! 116: #define LOCKPRE "/usr/spool/uucp/LCK." ! 117: #endif USRSPOOLLOCKS ! 118: ! 119: #define SQFILE "/usr/lib/uucp/SQFILE" ! 120: #define SQTMP "/usr/lib/uucp/SQTMP" ! 121: #define SLCKTIME 5400 /* system/device timeout (LCK.. files) */ ! 122: #define SYSFILE "/usr/lib/uucp/Systems" ! 123: #define DEVFILE "/usr/lib/uucp/Devices" ! 124: #define DIALERFILE "/usr/lib/uucp/Dialers" ! 125: #define DIALFILE "/usr/lib/uucp/Dialcodes" ! 126: #define PFILE "/usr/lib/uucp/Permissions" ! 127: ! 128: #define SPOOL "/usr/spool/uucp" ! 129: #define SEQDIR "/usr/spool/uucp/.Sequence" ! 130: ! 131: #define X_LOCKTIME 3600 ! 132: #ifdef USRSPOOLLOCKS ! 133: #define SEQLOCK "/usr/spool/locks/LCK.SQ." ! 134: #define SQLOCK "/usr/spool/locks/LCK.SQ" ! 135: #define X_LOCK "/usr/spool/locks/LCK.X" ! 136: #define S_LOCK "/usr/spool/locks/LCK.S" ! 137: #define X_LOCKDIR "/usr/spool/locks" /* must be dir part of above */ ! 138: #else ! 139: #define SEQLOCK "/usr/spool/uucp/LCK.SQ." ! 140: #define SQLOCK "/usr/spool/uucp/LCK.SQ" ! 141: #define X_LOCK "/usr/spool/uucp/LCK.X" ! 142: #define S_LOCK "/usr/spool/uucp/LCK.S" ! 143: #define X_LOCKDIR "/usr/spool/uucp" /* must be dir part of above */ ! 144: #endif USRSPOOLLOCKS ! 145: #define X_LOCKPRE "LCK.X" /* must be last part of above */ ! 146: ! 147: #define PUBDIR "/usr/spool/uucppublic" ! 148: #define ADMIN "/usr/spool/uucp/.Admin" ! 149: #define ERRLOG "/usr/spool/uucp/.Admin/errors" ! 150: #define SYSLOG "/usr/spool/uucp/.Admin/xferstats" ! 151: #define RMTDEBUG "/usr/spool/uucp/.Admin/audit" ! 152: #define CLEANUPLOGFILE "/usr/spool/uucp/.Admin/uucleanup" ! 153: ! 154: #define WORKSPACE "/usr/spool/uucp/.Workspace" ! 155: ! 156: #define SQTIME 60 ! 157: #define TRYCALLS 2 /* number of tries to dial call */ ! 158: #define MINULIMIT (1L<<11) /* minimum reasonable ulimit */ ! 159: ! 160: /* ! 161: * CDEBUG is for communication line debugging ! 162: * DEBUG is for program debugging ! 163: * #define SMALL to compile without the DEBUG code ! 164: */ ! 165: #define CDEBUG(l, f, s) if (Debug >= l) fprintf(stderr, f, s) ! 166: #ifndef SMALL ! 167: #define DEBUG(l, f, s) if (Debug >= l) fprintf(stderr, f, s) ! 168: #else ! 169: #define DEBUG(l, f, s) ! 170: #endif SMALL ! 171: ! 172: /* ! 173: * VERBOSE is used by cu and ct to inform the user ! 174: * about the progress of connection attempts. ! 175: * In uucp, this will be NULL. ! 176: */ ! 177: ! 178: #ifdef STANDALONE ! 179: #define VERBOSE(f, s) if (Verbose > 0) fprintf(stderr, f, s); else ! 180: #else ! 181: #define VERBOSE(f, s) ! 182: #endif ! 183: ! 184: #define PREFIX(pre, str) (strncmp((pre), (str), strlen(pre)) == SAME) ! 185: #define BASENAME(str, c) ((Bnptr = strrchr((str), c)) ? (Bnptr + 1) : (str)) ! 186: #define EQUALS(a,b) ((a) && (b) && (strcmp((a),(b))==SAME)) ! 187: #define EQUALSN(a,b,n) ((a) && (b) && (strncmp((a),(b),(n))==SAME)) ! 188: #define LASTCHAR(s) (s+strlen(s)-1) ! 189: ! 190: #define SAME 0 ! 191: #define ANYREAD 04 ! 192: #define ANYWRITE 02 ! 193: #define FAIL -1 ! 194: #define SUCCESS 0 ! 195: #define NULLCHAR '\0' ! 196: #define CNULL (char *) 0 ! 197: #define STBNULL (struct sgttyb *) 0 ! 198: #define MASTER 1 ! 199: #define SLAVE 0 ! 200: #define MAXBASENAME 14 /* should be DIRSIZ but 4.2bsd prohibits that */ ! 201: #define MAXFULLNAME BUFSIZ ! 202: #define MAXNAMESIZE 64 /* /usr/spool/uucp/<14 chars>/<14 chars>+slop */ ! 203: #define MAXMSGTIME 33 ! 204: #define MAXEXPECTTIME 45 ! 205: #define MAXCHARTIME 15 ! 206: #define NAMESIZE MAXBASENAME+1 ! 207: #define SIZEOFPID 10 /* maximum number of digits in a pid */ ! 208: #define EOTMSG "\004\n\004\n" ! 209: #define CALLBACK 1 ! 210: ! 211: /* manifest for chkpth flag */ ! 212: #define CK_READ 0 ! 213: #define CK_WRITE 1 ! 214: ! 215: /* ! 216: * commands ! 217: */ ! 218: #define SHELL "/bin/sh" ! 219: #define UUCICO "/usr/lib/uucp/uucico" ! 220: #define UUSCHED "/usr/lib/uucp/uusched" ! 221: #define UUXQT "/usr/lib/uucp/uuxqt" ! 222: #define UUCP "uucp" ! 223: #ifdef V7 ! 224: #define UUPS "/usr/lib/uucp/uups" ! 225: #endif ! 226: ! 227: ! 228: /* system status stuff */ ! 229: #define SS_OK 0 ! 230: #define SS_NO_DEVICE 1 ! 231: #define SS_TIME_WRONG 2 ! 232: #define SS_INPROGRESS 3 ! 233: #define SS_CONVERSATION 4 ! 234: #define SS_SEQBAD 5 ! 235: #define SS_LOGIN_FAILED 6 ! 236: #define SS_DIAL_FAILED 7 ! 237: #define SS_BAD_LOG_MCH 8 ! 238: #define SS_LOCKED_DEVICE 9 ! 239: #define SS_ASSERT_ERROR 10 ! 240: #define SS_BADSYSTEM 11 ! 241: #define SS_CANT_ACCESS_DEVICE 12 ! 242: #define SS_DEVICE_FAILED 13 /* No longer used */ ! 243: #define SS_WRONG_MCH 14 ! 244: #define SS_CALLBACK 15 ! 245: #define SS_RLOCKED 16 ! 246: #define SS_RUNKNOWN 17 ! 247: #define SS_RLOGIN 18 ! 248: #define SS_UNKNOWN_RESPONSE 19 ! 249: #define SS_STARTUP 20 ! 250: #define SS_CHAT_FAILED 21 ! 251: ! 252: #define MAXPH 60 /* maximum phone string size */ ! 253: #define MAXC BUFSIZ ! 254: ! 255: #define TRUE 1 ! 256: #define FALSE 0 ! 257: #define NAMEBUF 32 ! 258: ! 259: /* structure of an Systems file line */ ! 260: #define F_MAX 50 /* max number of fields in Systems file line */ ! 261: #define F_NAME 0 ! 262: #define F_TIME 1 ! 263: #define F_TYPE 2 ! 264: #define F_CLASS 3 /* an optional prefix and the speed */ ! 265: #define F_PHONE 4 ! 266: #define F_LOGIN 5 ! 267: ! 268: /* structure of an Devices file line */ ! 269: #define D_TYPE 0 ! 270: #define D_LINE 1 ! 271: #define D_CALLDEV 2 ! 272: #define D_CLASS 3 ! 273: #define D_CALLER 4 ! 274: #define D_ARG 5 ! 275: #define D_MAX 50 /* max number of fields in Devices file line */ ! 276: ! 277: #define D_ACU 1 ! 278: #define D_DIRECT 2 ! 279: #define D_PROT 4 ! 280: ! 281: /* past here, local changes are not recommended */ ! 282: #define CMDPRE 'C' ! 283: #define DATAPRE 'D' ! 284: #define XQTPRE 'X' ! 285: ! 286: /* ! 287: * stuff for command execution ! 288: */ ! 289: #define X_RQDFILE 'F' ! 290: #define X_STDIN 'I' ! 291: #define X_STDOUT 'O' ! 292: #define X_CMD 'C' ! 293: #define X_USER 'U' ! 294: #define X_BRINGBACK 'B' ! 295: #define X_MAILF 'M' ! 296: #define X_RETADDR 'R' ! 297: #define X_COMMENT '#' ! 298: #define X_NONZERO 'Z' ! 299: #define X_SENDNOTHING 'N' ! 300: #define X_SENDZERO 'n' ! 301: ! 302: ! 303: /* This structure describes call routines */ ! 304: struct caller { ! 305: char *CA_type; ! 306: int (*CA_caller)(); ! 307: }; ! 308: ! 309: /* This structure describes dialing routines */ ! 310: struct dialer { ! 311: char *DI_type; ! 312: int (*DI_dialer)(); ! 313: }; ! 314: ! 315: struct nstat { ! 316: int t_pid; /* process id */ ! 317: long t_start; /* process id */ ! 318: time_t t_beg; /* start time */ ! 319: time_t t_scall; /* start call to system */ ! 320: time_t t_ecall; /* end call to system */ ! 321: time_t t_tacu; /* acu time */ ! 322: time_t t_tlog; /* login time */ ! 323: time_t t_sftp; /* start file transfer protocol */ ! 324: time_t t_sxf; /* start xfer */ ! 325: time_t t_exf; /* end xfer */ ! 326: time_t t_eftp; /* end file transfer protocol */ ! 327: time_t t_qtime; /* time file queued */ ! 328: int t_ndial; /* # of dials */ ! 329: int t_nlogs; /* # of login trys */ ! 330: struct tms t_tbb; /* start execution times */ ! 331: struct tms t_txfs; /* xfer start times */ ! 332: struct tms t_txfe; /* xfer end times */ ! 333: struct tms t_tga; /* garbage execution times */ ! 334: }; ! 335: ! 336: /* external declarations */ ! 337: ! 338: extern int Ifn, Ofn; ! 339: extern int Debug, Verbose; ! 340: extern int Bspeed; ! 341: extern int Uid, Euid; /* user-id and effective-uid */ ! 342: extern char Wrkdir[]; ! 343: extern long Retrytime; ! 344: extern char **Env; ! 345: extern char Uucp[]; ! 346: extern char Pchar; ! 347: extern struct nstat Nstat; ! 348: extern char Dc[]; /* line name */ ! 349: extern char Fwdname[]; /* foward name */ ! 350: extern int Seqn; /* sequence # */ ! 351: extern int Role; ! 352: extern char Logfile[]; ! 353: extern int linebaudrate; /* adjust sleep time on read in pk driver */ ! 354: extern char Rmtname[]; ! 355: extern char User[]; ! 356: extern char Loginuser[]; ! 357: extern char *Thisdir; ! 358: extern char *Spool; ! 359: extern char *Pubdir; ! 360: extern char Myname[]; ! 361: extern char Progname[]; ! 362: extern char RemSpool[]; ! 363: extern char *Bnptr; /* used when BASENAME macro is expanded */ ! 364: extern char *sys_errlist[]; ! 365: ! 366: extern char Jobid[]; /* Jobid of current C. file */ ! 367: extern int Uerror; /* global error code */ ! 368: extern char *UerrorText[]; /* text for error code */ ! 369: ! 370: /* Some global I need for section 2 and section 3 routines */ ! 371: extern errno; ! 372: extern char *optarg; /* for getopt() */ ! 373: extern int optind; /* for getopt() */ ! 374: ! 375: ! 376: #define UERRORTEXT UerrorText[Uerror] ! 377: #define UTEXT(x) UerrorText[x] ! 378: ! 379: /* things get kind of gross beyond this point -- please stay out */ ! 380: ! 381: #define index strchr ! 382: #define rindex strrchr ! 383: #ifdef ATTSV ! 384: #define vfork fork ! 385: #define ATTSVKILL ! 386: #define UNAME ! 387: #endif ! 388: ! 389: #ifdef lint ! 390: #define VERSION(x) ; ! 391: #define ASSERT(e, s1, s2, i1) ; ! 392: ! 393: #else ! 394: ! 395: #define VERSION(x) static char sccsid[] = "x"; ! 396: #define ASSERT(e, s1, s2, i1) if (!(e)) {\ ! 397: assert(s1, s2, i1, sccsid, __FILE__, __LINE__);\ ! 398: cleanup(FAIL);}; ! 399: #endif ! 400: ! 401: extern struct stat __s_; ! 402: #define READANY(f) ((stat((f),&__s_)==0) && ((__s_.st_mode&(0004))!=0) ) ! 403: #define READSOME(f) ((stat((f),&__s_)==0) && ((__s_.st_mode&(0444))!=0) ) ! 404: ! 405: #define WRITEANY(f) ((stat((f),&__s_)==0) && ((__s_.st_mode&(0002))!=0) ) ! 406: #define DIRECTORY(f) ((stat((f),&__s_)==0) && ((__s_.st_mode&(S_IFMT))==S_IFDIR) ) ! 407: #define NOTEMPTY(f) ((stat((f),&__s_)==0) && (__s_.st_size!=0) ) ! 408: ! 409: #ifndef READDIR ! 410: #define DIR FILE ! 411: #define opendir(x) fopen((x), "r") ! 412: #define closedir(x) fclose((x)) ! 413: #endif ! 414: ! 415: /* standard functions used */ ! 416: ! 417: extern char *strcat(), *strcpy(), *strncpy(), *strrchr(); ! 418: extern char *strchr(), *strpbrk(); ! 419: extern char *index(), *rindex(), *getlogin(), *ttyname(), *malloc(); ! 420: extern char *calloc(); ! 421: extern long times(), lseek(), atol(); ! 422: extern time_t time(); ! 423: extern int strlen(), strcmp(), strncmp(); ! 424: extern int execle(), fork(), pipe(), close(), fcntl(), getopt(); ! 425: extern struct tm *localtime(); ! 426: extern FILE *popen(); ! 427: ! 428: /* uucp functions and subroutine */ ! 429: extern int anlwrk(), iswrk(), gtwvec(); /* anlwrk.c */ ! 430: extern void chremdir(), mkremdir(); /* chremdir.c */ ! 431: extern void toCorrupt(); /* cpmv.c */ ! 432: extern int xcp(), xmv(); /* cpmv.c */ ! 433: ! 434: extern int getargs(); /* getargs.c */ ! 435: extern void bsfix(); /* getargs.c */ ! 436: extern char *getprm(); /* getprm.c */ ! 437: ! 438: extern void logent(), syslog(), closelog(); /* logent.c */ ! 439: extern time_t millitick(); /* logent.c */ ! 440: ! 441: extern char *protoString(); /* permission.c */ ! 442: extern logFind(), mchFind(); /* permission.c */ ! 443: extern chkperm(), chkpth(); /* permission.c */ ! 444: extern cmdOK(), switchRole(); /* permission.c */ ! 445: extern callBack(), requestOK(); /* permission.c */ ! 446: extern void myName(); /* permission.c */ ! 447: ! 448: extern void systat(); /* systat.c */ ! 449: extern int ulockf(), checkLock(), delock(); /* ulockf.c */ ! 450: extern int mlock(); /* ulockf.c */ ! 451: extern void rmlock(), ultouch(); /* ulockf.c */ ! 452: extern char *timeStamp(); /* utility.c */ ! 453: extern void assert(), errent(); /* utility.c */ ! 454: extern void uucpname(); /* uucpname.c */ ! 455: extern int versys(); /* versys.c */ ! 456: extern void xuuxqt(), xuucico(); /* xqt.c */ ! 457: ! 458: #ifdef ATTSV ! 459: unsigned sleep(); ! 460: void exit(), setbuf(); ! 461: long ulimit(); ! 462: #else ! 463: int sleep(), exit(), setbuf(), ftime(); ! 464: #endif ! 465: ! 466: #ifndef NOUSTAT ! 467: #ifdef V7USTAT ! 468: struct ustat { ! 469: daddr_t f_tfree; /* total free */ ! 470: ino_t f_tinode; /* total inodes free */ ! 471: }; ! 472: #else ! 473: #include <ustat.h> ! 474: #endif ! 475: #endif ! 476: ! 477: #ifdef UNAME ! 478: #include <sys/utsname.h> ! 479: #endif ! 480: ! 481: #ifdef BSD4_2 ! 482: char *gethostname(); ! 483: #endif ! 484: ! 485: /* messages */ ! 486: extern char *Ct_OPEN; ! 487: extern char *Ct_WRITE; ! 488: extern char *Ct_READ; ! 489: extern char *Ct_CREATE; ! 490: extern char *Ct_ALLOCATE; ! 491: extern char *Ct_LOCK; ! 492: extern char *Ct_STAT; ! 493: extern char *Ct_CHOWN; ! 494: extern char *Ct_CHMOD; ! 495: extern char *Ct_LINK; ! 496: extern char *Ct_CHDIR; ! 497: extern char *Ct_UNLINK; ! 498: extern char *Wr_ROLE; ! 499: extern char *Ct_CORRUPT; ! 500: extern char *Ct_FORK; ! 501: extern char *Ct_CLOSE; ! 502: extern char *Fl_EXISTS; ! 503: extern char *Ue_BADSYSTEM; ! 504: extern char *Ue_TIME_WRONG; ! 505: extern char *Ue_SYSTEM_LOCKED; ! 506: extern char *Ue_NO_DEVICE; ! 507: extern char *Ue_DIAL_FAILED; ! 508: extern char *Ue_LOGIN_FAILED; ! 509: extern char *Ue_SEQBAD; ! 510: extern char *Ue_BAD_LOG_MCH; ! 511: extern char *Ue_WRONG_MCH; ! 512: extern char *Ue_LOCKED_DEVICE; ! 513: extern char *Ue_ASSERT_ERROR; ! 514: extern char *Ue_CANT_ACCESS_DEVICE; ! 515: extern char *Ue_DEVICE_FAILED;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.