|
|
1.1 ! root 1: #include "sam.h" ! 2: #include <sys/ioctl.h> ! 3: #ifdef SUN ! 4: /* a hack to get around redef of ushort in sys/types.h . ! 5: this depends on non-use of ushort in this file */ ! 6: #define ushort USHORT ! 7: #endif ! 8: #include <sys/types.h> ! 9: #include <sys/stat.h> ! 10: #ifndef SUN ! 11: #include "/usr/jerq/include/jioctl.h" ! 12: #endif ! 13: ! 14: writef(f) ! 15: register File *f; ! 16: { ! 17: uchar c; ! 18: Posn n; ! 19: struct stat statb; ! 20: int newfile=0; ! 21: if(stat((char *)genstr.s, &statb)==-1) ! 22: newfile++; ! 23: else if(strcmp(genstr.s, f->name.s)==0 && ! 24: (f->inumber!=statb.st_ino || f->date<statb.st_mtime)){ ! 25: f->inumber=statb.st_ino; ! 26: f->date=statb.st_mtime; ! 27: warn_s(Wdate, (char *)genstr.s); ! 28: return; ! 29: } ! 30: if((io=creat((char *)genstr.s, 0666))<0) ! 31: error_s(Ecreate, (char *)genstr.s); ! 32: dprint("%s: ", (char *)genstr.s); ! 33: n=writeio(f); ! 34: if(f->name.s[0]==0 || strcmp(genstr.s, f->name.s)==0) ! 35: state(f, addr.r.p1==0 && addr.r.p2==f->nbytes? Clean : Dirty); ! 36: if(newfile) ! 37: dprint("(new file) "); ! 38: if(addr.r.p2>0 && Fchars(f, &c, addr.r.p2-1, addr.r.p2) && c!='\n') ! 39: warn(Wnotnewline); ! 40: if(f->name.s[0]==0 || strcmp(genstr.s, f->name.s)==0){ ! 41: fstat(io, &statb); ! 42: f->inumber=statb.st_ino; ! 43: f->date=statb.st_mtime; ! 44: } ! 45: closeio(n); ! 46: } ! 47: Posn ! 48: readio(f, nonascii, setdate) ! 49: register File *f; ! 50: int *nonascii; ! 51: { ! 52: register n; ! 53: register Posn nt; ! 54: register Posn p=addr.r.p2; ! 55: struct stat statb; ! 56: if(nonascii) ! 57: *nonascii=FALSE; ! 58: for(nt=0; (n=read(io, (char *)genbuf, BLOCKSIZE))>0; nt+=n){ ! 59: n=clean(genbuf, n, nonascii); ! 60: Finsert(f, tempstr(genbuf, n), p); ! 61: } ! 62: if(nonascii && *nonascii) ! 63: warn(Wnonascii); ! 64: if(setdate){ ! 65: fstat(io, &statb); ! 66: f->inumber=statb.st_ino; ! 67: f->date=statb.st_mtime; ! 68: } ! 69: return nt; ! 70: } ! 71: Posn ! 72: writeio(f) ! 73: register File *f; ! 74: { ! 75: register n; ! 76: register Posn p=addr.r.p1; ! 77: while(p<addr.r.p2){ ! 78: if(addr.r.p2-p>BLOCKSIZE) ! 79: n=BLOCKSIZE; ! 80: else ! 81: n=addr.r.p2-p; ! 82: if(Fchars(f, genbuf, p, p+n)!=n) ! 83: panic("writef read"); ! 84: (void)Write(io, genbuf, n); ! 85: p+=n; ! 86: } ! 87: return addr.r.p2-addr.r.p1; ! 88: } ! 89: closeio(p) ! 90: Posn p; ! 91: { ! 92: (void)close(io); ! 93: io=0; ! 94: if(p>=0) ! 95: dprint("#%lud\n", p); ! 96: } ! 97: clean(s, n, nonascii) ! 98: register uchar *s; ! 99: register n; ! 100: int *nonascii; ! 101: { ! 102: register uchar *p, *q; ! 103: register i; ! 104: /* for speed, just look first */ ! 105: p=s; ! 106: if(i=n) ! 107: do ! 108: if(*p==0 || (*p++&HIGHBIT)) ! 109: goto Cleanup; ! 110: while(--i); ! 111: return n; /* usual case */ ! 112: Cleanup: ! 113: for(q=p=s, i=0; i<n; i++, p++) ! 114: if(*p!=0 && (*p&HIGHBIT)==0) ! 115: *q++= *p; ! 116: if(nonascii) ! 117: *nonascii=TRUE; ! 118: return q-s; ! 119: } ! 120: #ifndef SUN ! 121: bootterm(zflag) ! 122: { ! 123: if(system("/usr/jerq/bin/32ld", "32ld", ! 124: #ifdef DIST ! 125: zflag? "-z" : "-", "/usr/jerq/mbin/sam.m")){ ! 126: #else ! 127: zflag? "-z" : "-", "/n/ikeya/usr/rob/sam/term/a.out")){ ! 128: #endif ! 129: dprint("sam: can't boot terminal program\n"); ! 130: return 0; ! 131: } ! 132: return 1; ! 133: } ! 134: #endif !SUN ! 135: rawmode(raw) ! 136: { ! 137: struct sgttyb buf; ! 138: ioctl(0, TIOCGETP, &buf); ! 139: if(raw){ ! 140: ioctl(0, TIOCEXCL, (struct sgttyb *)0); ! 141: buf.sg_flags|=RAW|ANYP; ! 142: }else{ ! 143: ioctl(0, TIOCNXCL, (struct sgttyb *)0); ! 144: #ifndef SUN ! 145: ioctl(0, JTERM, (struct sgttyb *)0); ! 146: #endif ! 147: buf.sg_flags&=~(RAW|ANYP); ! 148: } ! 149: ioctl(0, TIOCSETP, &buf); ! 150: } ! 151: system(s, t, u, v) ! 152: char *s, *t, *u, *v; ! 153: { ! 154: int status, pid, l; ! 155: if((pid=fork()) == 0) { ! 156: execl(s, t, u, v, 0); ! 157: _exit(127); ! 158: } ! 159: do; while((l=wait(&status))!=pid && l!=-1); ! 160: if(l==-1) ! 161: status= -1; ! 162: return(status); ! 163: } ! 164: closeonexec(fd){ ! 165: ioctl(fd, FIOCLEX, (struct sgttyb *)0); ! 166: } ! 167: #ifndef SUN ! 168: static int remotefd; ! 169: connectto(machine) ! 170: char *machine; ! 171: { ! 172: if(strncmp((uchar *)machine, (uchar *)"inet/", 5)==0) ! 173: remotefd=tcpexec(machine+5, "exec /usr/jerq/bin/sam -R"); ! 174: else ! 175: remotefd=tdkexec(machine, "exec /usr/jerq/bin/sam -R"); ! 176: if(remotefd<0){ ! 177: dprint("sam: can't call %s\n", machine); ! 178: exit(1); ! 179: } ! 180: } ! 181: join(){ ! 182: switch(fork()){ ! 183: case 0: ! 184: close(0); ! 185: dup(remotefd); ! 186: execl("/bin/cat", 0); ! 187: default: ! 188: close(1); ! 189: dup(remotefd); ! 190: execl("/bin/cat", 0); ! 191: case -1: ! 192: dprint("sam: can't fork\n"); ! 193: } ! 194: exit(1); ! 195: } ! 196: ! 197: int ! 198: tcpexec(host, cmd) ! 199: char *host; ! 200: char *cmd; ! 201: { ! 202: int pfd[2]; ! 203: ! 204: if (pipe(pfd)<0) ! 205: return -1; ! 206: switch(fork()) { ! 207: case -1: ! 208: return -1; ! 209: case 0: ! 210: break; ! 211: default: ! 212: close(pfd[0]); ! 213: return(pfd[1]); ! 214: } ! 215: close(pfd[1]); ! 216: if (dup2(pfd[0], 0)<0 || dup2(pfd[0], 1)<0 || dup2(pfd[0], 2)<0) { ! 217: dprint("sam: can't redirect\n"); ! 218: exit(1); ! 219: } ! 220: close(pfd[0]); ! 221: execl("/usr/inet/bin/rsh", host, cmd, 0); ! 222: dprint("sam: can't exec rsh\n"); ! 223: exit(1); ! 224: return -1; /* for cyntax */ ! 225: } ! 226: #endif !SUN
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.