#include "nfs.h" int iflag 0; int xflag 0; struct stk *xsp stack; char *nxt &end; char *last &end; char *terr "snt\0\0"; char *stat1 "f rwxrwxrwx"; char *ng ".\0"; main(argc,argv) int argc; char **argv; { extern fout; int i; int compar(); flush(); fout = 2; sbrk(16); if (argc<2) ex(1); eargv=argv+argc; if((fn = open("/dev/tiu/d1",2)) < 0) { printf("Spider busy\n"); ex(2); } getpw(getuid(),nam); /* get login name */ for(np = nam; *np != ':'; np++); /* find the ':' delimiter */ *np = '\0'; name(nam); /* put login name in buf to send to File Store */ *bp++ = LOGIN; if(sendc(OK))ex(1); argv++; /* interpret command */ if (*argv[0] != '-') { bp = buf; for (; argv != eargv; argv++) { for (tp = *argv; *tp; tp++) { *bp++ = *tp; if (bp == &buf[510]) {printf("too many args\n"); ex(1);} } *bp++ = ' '; } *bp++ = '\n'; ff = 1; rd('r'); qt(0); } /* break out functions and set flags for key args */ for (tp = *argv++ + 1 ; *tp; tp++) switch(*tp) { case 't': case 'l': case 'm': case 'w': case 'u': case 'd': case 'r': case 's': if(op != 0){printf("illegal function\n"); qt(1);} op = *tp; continue; case 'v': vflag++; continue; case 'i': iflag++; continue; case 'x': xflag++; continue; case 'c': /* another directory in File Store is used */ if (argv == eargv) { printf("directory required with 'c' function\n"); qt(1); } np = nam; bp = *argv; while (*np++ = *bp++); name(*argv++); *bp++ = CDIR; if (sendc(OK)) ex(1); argc--; continue; default: printf("illegal function\n"); qt(1); } if (argv == eargv) /* no file is named use current directory */ { argv= &ng; eargv=argv+1;} sp = stack; for (;;) { tp = gen(); if (!tp) /* pick up next arg from cmd line */ { if (argv == eargv) qt(0); tp = *argv++; np = nam; while(*np++ = *tp++); sp[spos] = --np; tp = nam; } fsp = tp; name(fsp); switch(op) { case 'm': if (ask()) break; mdir: *bp++ = UNLESS; *bp++ = DCREATE; *bp++ = FI; goto single; case 'w': case 'u': if (ask()) break; ff = open(tp,0); if (ff<0) goto erf; if (dir()) goto mdir; if(op == 'u') /* test if file has been updated */ { tme[0] = dirbuf[16]; tme[1] = dirbuf[17]; i = gstat(); if (i == 0) { /* file exists */ if(dbcmp(tme,dirbuf->i_modtime) < 0) { close(ff); break;} } else if (i != -1) break; name(fsp); } *bp++ = FCREATE; *bp++ = WRITE; *bp++ = CLOSE; if(sendc(WRITE))break; /* send the command */ sum=0; length=0; do { nchar = read(ff,buf,512); /* sum =+ addup(nchar); length =+ nchar; */ if (nchar==0) code=2; else code=1; if (send(nchar,code) < 0) trouble(); } while(nchar > 0); if(check(OK) < 0) /* error */ { exx(); qt(1); } goto knxt; case 'r': if(xflag ||ask()) break; if(xdir(1)) /* extract a directory */ { /* is it an existing directory */ if(((i = stat(tp,dirbuf)) >= 0))break; if((i = fork()) == 0) execl("/bin/mkdir","mkdir",tp,0); if((i < 0) || ((wait(&i)) < 0) || ((stat(tp,dirbuf)) < 0)) { printf("directory %s cannot be created\n",nam);qt(1); } break; } if((ff = creat(tp,0666)) < 0)goto erf; *bp++ = itype; *bp++ = 0; *bp++ = 0; *bp++ = OPEN; *bp++ = READ; *bp++ = CLOSE; if(rd(op)) /* read data and put in file */ goto cnxt1; /* an error */ knxt: /* bp = buf; *bp++ = 'K'; *bp++ = (sum >> 8); *bp++ = (sum & 0377); *bp++ = (length >> 8); *bp++ = (length & 0377); if(sendc(OK))goto cnxt1; */ cnxt: if(vflag)printf("%c %s\n",op,nam); cnxt1: close(ff); break; case 'd': if (argc < 3) ex(0); xflag = 1; if ((xdir(1) == 1) || (ask())) break; *bp++ = DELETE; single: if((!sendc(OK)) && (vflag)) /* send just a command -no data */ printf("%c %s\n",op,nam); break; case 's': fout = 1; spstat(); /* get status from file store */ fout = 2; break; case 't': case 'l': nxt = &end; i = xdir(0); if ((i == 0) || (i == 2)) { fout = 1; astat(op); fout = 2; break; } if (i > 0) { qsort(&end,(nxt - &end)/14,14,compar); for(tp = &end; tp < nxt; tp =+ 14) { append(tp,sp[spos]);name(fsp); fout = 1; if (op == 't') printf("%s\n",tp); else astat(op); fout = 2; } } break; default: printf("illegal op-code\n"); qt(1); } nxtarg:; } erf: printf("%s : cannot open ",tp); perror(""); printf("\n"); goto nxtarg; }