Hex Artifact Content
Not logged in

Artifact 854a591c0e7a3a54b66916c1345aa04283dd0385:


0000: 23 69 6e 63 6c 75 64 65 20 22 6e 66 73 2e 68 22  #include "nfs.h"
0010: 0a 0a 69 6e 74 20 69 66 6c 61 67 20 30 3b 0a 69  ..int iflag 0;.i
0020: 6e 74 20 78 66 6c 61 67 20 30 3b 0a 73 74 72 75  nt xflag 0;.stru
0030: 63 74 20 73 74 6b 20 2a 78 73 70 20 73 74 61 63  ct stk *xsp stac
0040: 6b 3b 0a 63 68 61 72 20 2a 6e 78 74 20 26 65 6e  k;.char *nxt &en
0050: 64 3b 0a 63 68 61 72 20 2a 6c 61 73 74 20 26 65  d;.char *last &e
0060: 6e 64 3b 0a 0a 63 68 61 72 20 2a 74 65 72 72 20  nd;..char *terr 
0070: 22 73 6e 74 5c 30 5c 30 22 3b 0a 63 68 61 72 20  "snt\0\0";.char 
0080: 2a 73 74 61 74 31 20 22 66 20 72 77 78 72 77 78  *stat1 "f rwxrwx
0090: 72 77 78 22 3b 0a 63 68 61 72 20 2a 6e 67 20 22  rwx";.char *ng "
00a0: 2e 5c 30 22 3b 0a 0a 6d 61 69 6e 28 61 72 67 63  .\0";..main(argc
00b0: 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67 63 3b  ,argv).int argc;
00c0: 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 09 7b  .char **argv;..{
00d0: 0a 09 65 78 74 65 72 6e 20 66 6f 75 74 3b 0a 09  ..extern fout;..
00e0: 69 6e 74 20 69 3b 0a 09 69 6e 74 20 63 6f 6d 70  int i;..int comp
00f0: 61 72 28 29 3b 0a 0a 09 66 6c 75 73 68 28 29 3b  ar();...flush();
0100: 0a 09 66 6f 75 74 20 3d 20 32 3b 0a 09 73 62 72  ..fout = 2;..sbr
0110: 6b 28 31 36 29 3b 0a 09 69 66 20 28 61 72 67 63  k(16);..if (argc
0120: 3c 32 29 20 65 78 28 31 29 3b 20 65 61 72 67 76  <2) ex(1); eargv
0130: 3d 61 72 67 76 2b 61 72 67 63 3b 0a 0a 09 69 66  =argv+argc;...if
0140: 28 28 66 6e 20 3d 20 6f 70 65 6e 28 22 2f 64 65  ((fn = open("/de
0150: 76 2f 74 69 75 2f 64 31 22 2c 32 29 29 20 3c 20  v/tiu/d1",2)) < 
0160: 30 29 0a 09 09 7b 0a 09 09 70 72 69 6e 74 66 28  0)...{...printf(
0170: 22 53 70 69 64 65 72 20 62 75 73 79 5c 6e 22 29  "Spider busy\n")
0180: 3b 20 65 78 28 32 29 3b 0a 09 09 7d 0a 09 67 65  ; ex(2);...}..ge
0190: 74 70 77 28 67 65 74 75 69 64 28 29 2c 6e 61 6d  tpw(getuid(),nam
01a0: 29 3b 09 09 2f 2a 20 20 67 65 74 20 6c 6f 67 69  );../*  get logi
01b0: 6e 20 6e 61 6d 65 20 20 2a 2f 0a 09 66 6f 72 28  n name  */..for(
01c0: 6e 70 20 3d 20 6e 61 6d 3b 20 2a 6e 70 20 21 3d  np = nam; *np !=
01d0: 20 27 3a 27 3b 20 6e 70 2b 2b 29 3b 09 2f 2a 20   ':'; np++);./* 
01e0: 66 69 6e 64 20 74 68 65 20 27 3a 27 20 64 65 6c  find the ':' del
01f0: 69 6d 69 74 65 72 20 20 2a 2f 0a 09 2a 6e 70 20  imiter  */..*np 
0200: 3d 20 27 5c 30 27 3b 0a 09 6e 61 6d 65 28 6e 61  = '\0';..name(na
0210: 6d 29 3b 09 2f 2a 20 70 75 74 20 6c 6f 67 69 6e  m);./* put login
0220: 20 6e 61 6d 65 20 69 6e 20 62 75 66 20 74 6f 20   name in buf to 
0230: 73 65 6e 64 20 74 6f 20 46 69 6c 65 20 53 74 6f  send to File Sto
0240: 72 65 20 2a 2f 0a 09 2a 62 70 2b 2b 20 3d 20 4c  re */..*bp++ = L
0250: 4f 47 49 4e 3b 0a 09 69 66 28 73 65 6e 64 63 28  OGIN;..if(sendc(
0260: 4f 4b 29 29 65 78 28 31 29 3b 0a 0a 09 61 72 67  OK))ex(1);...arg
0270: 76 2b 2b 3b 0a 0a 09 09 2f 2a 20 69 6e 74 65 72  v++;..../* inter
0280: 70 72 65 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  pret command */.
0290: 0a 09 69 66 20 28 2a 61 72 67 76 5b 30 5d 20 21  ..if (*argv[0] !
02a0: 3d 20 27 2d 27 29 0a 09 09 7b 0a 09 09 62 70 20  = '-')...{...bp 
02b0: 3d 20 62 75 66 3b 0a 09 09 66 6f 72 20 28 3b 20  = buf;...for (; 
02c0: 61 72 67 76 20 21 3d 20 65 61 72 67 76 3b 20 61  argv != eargv; a
02d0: 72 67 76 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 66  rgv++)....{....f
02e0: 6f 72 20 28 74 70 20 3d 20 2a 61 72 67 76 3b 20  or (tp = *argv; 
02f0: 2a 74 70 3b 20 74 70 2b 2b 29 0a 09 09 09 09 7b  *tp; tp++).....{
0300: 0a 09 09 09 09 2a 62 70 2b 2b 20 3d 20 2a 74 70  .....*bp++ = *tp
0310: 3b 0a 09 09 09 09 69 66 20 28 62 70 20 3d 3d 20  ;.....if (bp == 
0320: 26 62 75 66 5b 35 31 30 5d 29 20 7b 70 72 69 6e  &buf[510]) {prin
0330: 74 66 28 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67  tf("too many arg
0340: 73 5c 6e 22 29 3b 20 65 78 28 31 29 3b 7d 0a 09  s\n"); ex(1);}..
0350: 09 09 09 7d 0a 09 09 09 2a 62 70 2b 2b 20 3d 20  ...}....*bp++ = 
0360: 27 20 27 3b 0a 09 09 09 7d 0a 09 09 2a 62 70 2b  ' ';....}...*bp+
0370: 2b 20 3d 20 27 5c 6e 27 3b 0a 09 09 66 66 20 3d  + = '\n';...ff =
0380: 20 31 3b 0a 09 09 72 64 28 27 72 27 29 3b 0a 09   1;...rd('r');..
0390: 09 71 74 28 30 29 3b 0a 09 09 7d 0a 0a 09 09 2f  .qt(0);...}..../
03a0: 2a 20 62 72 65 61 6b 20 6f 75 74 20 66 75 6e 63  * break out func
03b0: 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 20 66 6c  tions and set fl
03c0: 61 67 73 20 66 6f 72 20 6b 65 79 20 61 72 67 73  ags for key args
03d0: 20 2a 2f 0a 0a 09 66 6f 72 20 28 74 70 20 3d 20   */...for (tp = 
03e0: 2a 61 72 67 76 2b 2b 20 2b 20 31 20 3b 20 2a 74  *argv++ + 1 ; *t
03f0: 70 3b 20 74 70 2b 2b 29 20 73 77 69 74 63 68 28  p; tp++) switch(
0400: 2a 74 70 29 0a 09 09 7b 0a 09 63 61 73 65 20 27  *tp)...{..case '
0410: 74 27 3a 0a 09 63 61 73 65 20 27 6c 27 3a 0a 09  t':..case 'l':..
0420: 63 61 73 65 20 27 6d 27 3a 0a 09 63 61 73 65 20  case 'm':..case 
0430: 27 77 27 3a 0a 09 63 61 73 65 20 27 75 27 3a 0a  'w':..case 'u':.
0440: 09 63 61 73 65 20 27 64 27 3a 0a 09 63 61 73 65  .case 'd':..case
0450: 20 27 72 27 3a 0a 09 63 61 73 65 20 27 73 27 3a   'r':..case 's':
0460: 0a 09 09 69 66 28 6f 70 20 21 3d 20 30 29 7b 70  ...if(op != 0){p
0470: 72 69 6e 74 66 28 22 69 6c 6c 65 67 61 6c 20 66  rintf("illegal f
0480: 75 6e 63 74 69 6f 6e 5c 6e 22 29 3b 20 71 74 28  unction\n"); qt(
0490: 31 29 3b 7d 0a 09 09 6f 70 20 3d 20 2a 74 70 3b  1);}...op = *tp;
04a0: 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 63  ...continue;...c
04b0: 61 73 65 20 27 76 27 3a 0a 09 09 76 66 6c 61 67  ase 'v':...vflag
04c0: 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ++;...continue;.
04d0: 0a 09 63 61 73 65 20 27 69 27 3a 0a 09 09 69 66  ..case 'i':...if
04e0: 6c 61 67 2b 2b 3b 0a 09 09 63 6f 6e 74 69 6e 75  lag++;...continu
04f0: 65 3b 0a 09 63 61 73 65 20 27 78 27 3a 0a 09 09  e;..case 'x':...
0500: 78 66 6c 61 67 2b 2b 3b 0a 09 09 63 6f 6e 74 69  xflag++;...conti
0510: 6e 75 65 3b 0a 0a 09 63 61 73 65 20 27 63 27 3a  nue;...case 'c':
0520: 09 2f 2a 20 61 6e 6f 74 68 65 72 20 64 69 72 65  ./* another dire
0530: 63 74 6f 72 79 20 69 6e 20 46 69 6c 65 20 53 74  ctory in File St
0540: 6f 72 65 20 69 73 20 75 73 65 64 20 20 2a 2f 0a  ore is used  */.
0550: 09 09 69 66 20 28 61 72 67 76 20 3d 3d 20 65 61  ..if (argv == ea
0560: 72 67 76 29 20 0a 09 09 09 7b 0a 09 09 09 70 72  rgv) ....{....pr
0570: 69 6e 74 66 28 22 64 69 72 65 63 74 6f 72 79 20  intf("directory 
0580: 72 65 71 75 69 72 65 64 20 77 69 74 68 20 27 63  required with 'c
0590: 27 20 66 75 6e 63 74 69 6f 6e 5c 6e 22 29 3b 0a  ' function\n");.
05a0: 09 09 09 71 74 28 31 29 3b 0a 09 09 09 7d 0a 09  ...qt(1);....}..
05b0: 09 6e 70 20 3d 20 6e 61 6d 3b 20 62 70 20 3d 20  .np = nam; bp = 
05c0: 2a 61 72 67 76 3b 0a 09 09 77 68 69 6c 65 20 28  *argv;...while (
05d0: 2a 6e 70 2b 2b 20 3d 20 2a 62 70 2b 2b 29 3b 0a  *np++ = *bp++);.
05e0: 09 09 6e 61 6d 65 28 2a 61 72 67 76 2b 2b 29 3b  ..name(*argv++);
05f0: 0a 09 09 2a 62 70 2b 2b 20 3d 20 43 44 49 52 3b  ...*bp++ = CDIR;
0600: 0a 09 09 69 66 20 28 73 65 6e 64 63 28 4f 4b 29  ...if (sendc(OK)
0610: 29 20 65 78 28 31 29 3b 0a 09 09 61 72 67 63 2d  ) ex(1);...argc-
0620: 2d 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  -;...continue;..
0630: 64 65 66 61 75 6c 74 3a 0a 09 09 70 72 69 6e 74  default:...print
0640: 66 28 22 69 6c 6c 65 67 61 6c 20 66 75 6e 63 74  f("illegal funct
0650: 69 6f 6e 5c 6e 22 29 3b 20 71 74 28 31 29 3b 0a  ion\n"); qt(1);.
0660: 09 09 7d 0a 0a 0a 09 69 66 20 28 61 72 67 76 20  ..}....if (argv 
0670: 3d 3d 20 65 61 72 67 76 29 09 09 2f 2a 20 6e 6f  == eargv)../* no
0680: 20 66 69 6c 65 20 69 73 20 6e 61 6d 65 64 20 75   file is named u
0690: 73 65 20 63 75 72 72 65 6e 74 20 64 69 72 65 63  se current direc
06a0: 74 6f 72 79 20 2a 2f 0a 09 09 7b 20 61 72 67 76  tory */...{ argv
06b0: 3d 20 26 6e 67 3b 20 65 61 72 67 76 3d 61 72 67  = &ng; eargv=arg
06c0: 76 2b 31 3b 7d 0a 09 73 70 20 3d 20 73 74 61 63  v+1;}..sp = stac
06d0: 6b 3b 0a 09 66 6f 72 20 28 3b 3b 29 0a 09 09 7b  k;..for (;;)...{
06e0: 0a 09 09 74 70 20 3d 20 67 65 6e 28 29 3b 0a 09  ...tp = gen();..
06f0: 09 69 66 20 28 21 74 70 29 09 2f 2a 20 70 69 63  .if (!tp)./* pic
0700: 6b 20 75 70 20 6e 65 78 74 20 61 72 67 20 66 72  k up next arg fr
0710: 6f 6d 20 63 6d 64 20 6c 69 6e 65 20 2a 2f 0a 09  om cmd line */..
0720: 09 09 7b 0a 09 09 09 69 66 20 28 61 72 67 76 20  ..{....if (argv 
0730: 3d 3d 20 65 61 72 67 76 29 20 71 74 28 30 29 3b  == eargv) qt(0);
0740: 0a 09 09 09 74 70 20 3d 20 2a 61 72 67 76 2b 2b  ....tp = *argv++
0750: 3b 20 6e 70 20 3d 20 6e 61 6d 3b 0a 09 09 09 77  ; np = nam;....w
0760: 68 69 6c 65 28 2a 6e 70 2b 2b 20 3d 20 2a 74 70  hile(*np++ = *tp
0770: 2b 2b 29 3b 0a 09 09 09 73 70 5b 73 70 6f 73 5d  ++);....sp[spos]
0780: 20 3d 20 2d 2d 6e 70 3b 0a 09 09 09 74 70 20 3d   = --np;....tp =
0790: 20 6e 61 6d 3b 0a 09 09 09 7d 0a 09 09 66 73 70   nam;....}...fsp
07a0: 20 3d 20 74 70 3b 0a 09 09 6e 61 6d 65 28 66 73   = tp;...name(fs
07b0: 70 29 3b 0a 09 09 73 77 69 74 63 68 28 6f 70 29  p);...switch(op)
07c0: 0a 09 09 09 7b 0a 09 09 63 61 73 65 20 27 6d 27  ....{...case 'm'
07d0: 3a 0a 09 09 09 69 66 20 28 61 73 6b 28 29 29 20  :....if (ask()) 
07e0: 62 72 65 61 6b 3b 0a 09 09 6d 64 69 72 3a 0a 09  break;...mdir:..
07f0: 09 09 2a 62 70 2b 2b 20 3d 20 55 4e 4c 45 53 53  ..*bp++ = UNLESS
0800: 3b 0a 09 09 09 2a 62 70 2b 2b 20 3d 20 44 43 52  ;....*bp++ = DCR
0810: 45 41 54 45 3b 0a 09 09 09 2a 62 70 2b 2b 20 3d  EATE;....*bp++ =
0820: 20 46 49 3b 0a 09 09 09 67 6f 74 6f 20 73 69 6e   FI;....goto sin
0830: 67 6c 65 3b 0a 09 09 63 61 73 65 20 27 77 27 3a  gle;...case 'w':
0840: 0a 09 09 63 61 73 65 20 27 75 27 3a 0a 09 09 09  ...case 'u':....
0850: 69 66 20 28 61 73 6b 28 29 29 20 62 72 65 61 6b  if (ask()) break
0860: 3b 0a 09 09 09 66 66 20 3d 20 6f 70 65 6e 28 74  ;....ff = open(t
0870: 70 2c 30 29 3b 0a 09 09 09 69 66 20 28 66 66 3c  p,0);....if (ff<
0880: 30 29 20 67 6f 74 6f 20 65 72 66 3b 0a 09 09 09  0) goto erf;....
0890: 69 66 20 28 64 69 72 28 29 29 20 67 6f 74 6f 20  if (dir()) goto 
08a0: 6d 64 69 72 3b 0a 09 09 09 69 66 28 6f 70 20 3d  mdir;....if(op =
08b0: 3d 20 27 75 27 29 09 2f 2a 20 74 65 73 74 20 69  = 'u')./* test i
08c0: 66 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  f file has been 
08d0: 75 70 64 61 74 65 64 20 20 2a 2f 0a 09 09 09 09  updated  */.....
08e0: 7b 0a 09 09 09 09 74 6d 65 5b 30 5d 20 3d 20 64  {.....tme[0] = d
08f0: 69 72 62 75 66 5b 31 36 5d 3b 20 74 6d 65 5b 31  irbuf[16]; tme[1
0900: 5d 20 3d 20 64 69 72 62 75 66 5b 31 37 5d 3b 0a  ] = dirbuf[17];.
0910: 09 09 09 09 69 20 3d 20 67 73 74 61 74 28 29 3b  ....i = gstat();
0920: 0a 09 09 09 09 69 66 20 28 69 20 3d 3d 20 30 29  .....if (i == 0)
0930: 0a 09 09 09 09 09 7b 0a 09 09 09 09 09 2f 2a 20  ......{....../* 
0940: 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 09  file exists */..
0950: 09 09 09 69 66 28 64 62 63 6d 70 28 74 6d 65 2c  ...if(dbcmp(tme,
0960: 64 69 72 62 75 66 2d 3e 69 5f 6d 6f 64 74 69 6d  dirbuf->i_modtim
0970: 65 29 20 3c 20 30 29 0a 09 09 09 09 09 20 09 7b  e) < 0)...... .{
0980: 20 63 6c 6f 73 65 28 66 66 29 3b 20 62 72 65 61   close(ff); brea
0990: 6b 3b 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 65  k;}......}.....e
09a0: 6c 73 65 20 69 66 20 28 69 20 21 3d 20 2d 31 29  lse if (i != -1)
09b0: 20 62 72 65 61 6b 3b 0a 09 09 09 09 6e 61 6d 65   break;.....name
09c0: 28 66 73 70 29 3b 0a 09 09 09 09 7d 0a 09 09 09  (fsp);.....}....
09d0: 2a 62 70 2b 2b 20 3d 20 46 43 52 45 41 54 45 3b  *bp++ = FCREATE;
09e0: 20 2a 62 70 2b 2b 20 3d 20 57 52 49 54 45 3b 20   *bp++ = WRITE; 
09f0: 2a 62 70 2b 2b 20 3d 20 43 4c 4f 53 45 3b 0a 09  *bp++ = CLOSE;..
0a00: 09 09 69 66 28 73 65 6e 64 63 28 57 52 49 54 45  ..if(sendc(WRITE
0a10: 29 29 62 72 65 61 6b 3b 09 09 2f 2a 20 73 65 6e  ))break;../* sen
0a20: 64 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 20 2a  d the command  *
0a30: 2f 0a 09 09 09 73 75 6d 3d 30 3b 20 6c 65 6e 67  /....sum=0; leng
0a40: 74 68 3d 30 3b 0a 09 09 09 64 6f 09 7b 0a 09 09  th=0;....do.{...
0a50: 09 09 6e 63 68 61 72 20 3d 20 72 65 61 64 28 66  ..nchar = read(f
0a60: 66 2c 62 75 66 2c 35 31 32 29 3b 0a 2f 2a 0a 09  f,buf,512);./*..
0a70: 09 09 09 73 75 6d 20 3d 2b 20 61 64 64 75 70 28  ...sum =+ addup(
0a80: 6e 63 68 61 72 29 3b 20 6c 65 6e 67 74 68 20 3d  nchar); length =
0a90: 2b 20 6e 63 68 61 72 3b 0a 2a 2f 0a 09 09 09 09  + nchar;.*/.....
0aa0: 69 66 20 28 6e 63 68 61 72 3d 3d 30 29 20 63 6f  if (nchar==0) co
0ab0: 64 65 3d 32 3b 20 65 6c 73 65 20 63 6f 64 65 3d  de=2; else code=
0ac0: 31 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64 28  1;.....if (send(
0ad0: 6e 63 68 61 72 2c 63 6f 64 65 29 20 3c 20 30 29  nchar,code) < 0)
0ae0: 20 74 72 6f 75 62 6c 65 28 29 3b 0a 09 09 09 09   trouble();.....
0af0: 7d 20 77 68 69 6c 65 28 6e 63 68 61 72 20 3e 20  } while(nchar > 
0b00: 30 29 3b 0a 09 09 09 69 66 28 63 68 65 63 6b 28  0);....if(check(
0b10: 4f 4b 29 20 3c 20 30 29 09 09 20 2f 2a 20 65 72  OK) < 0).. /* er
0b20: 72 6f 72 20 2a 2f 0a 09 09 09 09 7b 0a 09 09 09  ror */.....{....
0b30: 09 65 78 78 28 29 3b 20 71 74 28 31 29 3b 0a 09  .exx(); qt(1);..
0b40: 09 09 09 7d 0a 09 09 09 67 6f 74 6f 20 6b 6e 78  ...}....goto knx
0b50: 74 3b 0a 09 09 63 61 73 65 20 27 72 27 3a 0a 09  t;...case 'r':..
0b60: 09 09 69 66 28 78 66 6c 61 67 20 7c 7c 61 73 6b  ..if(xflag ||ask
0b70: 28 29 29 20 62 72 65 61 6b 3b 0a 09 09 09 69 66  ()) break;....if
0b80: 28 78 64 69 72 28 31 29 29 09 09 2f 2a 20 65 78  (xdir(1))../* ex
0b90: 74 72 61 63 74 20 61 20 64 69 72 65 63 74 6f 72  tract a director
0ba0: 79 20 2a 2f 0a 09 09 09 09 7b 0a 09 09 09 09 2f  y */.....{...../
0bb0: 2a 20 69 73 20 69 74 20 61 6e 20 65 78 69 73 74  * is it an exist
0bc0: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ing directory */
0bd0: 0a 09 09 09 09 69 66 28 28 28 69 20 3d 20 73 74  .....if(((i = st
0be0: 61 74 28 74 70 2c 64 69 72 62 75 66 29 29 20 3e  at(tp,dirbuf)) >
0bf0: 3d 20 30 29 29 62 72 65 61 6b 3b 0a 09 09 09 09  = 0))break;.....
0c00: 69 66 28 28 69 20 3d 20 66 6f 72 6b 28 29 29 20  if((i = fork()) 
0c10: 3d 3d 20 30 29 0a 09 09 09 09 09 65 78 65 63 6c  == 0)......execl
0c20: 28 22 2f 62 69 6e 2f 6d 6b 64 69 72 22 2c 22 6d  ("/bin/mkdir","m
0c30: 6b 64 69 72 22 2c 74 70 2c 30 29 3b 0a 09 09 09  kdir",tp,0);....
0c40: 09 69 66 28 28 69 20 3c 20 30 29 20 7c 7c 20 28  .if((i < 0) || (
0c50: 28 77 61 69 74 28 26 69 29 29 20 3c 20 30 29 20  (wait(&i)) < 0) 
0c60: 7c 7c 20 28 28 73 74 61 74 28 74 70 2c 64 69 72  || ((stat(tp,dir
0c70: 62 75 66 29 29 20 3c 20 30 29 29 0a 09 09 09 09  buf)) < 0)).....
0c80: 09 7b 0a 09 09 09 09 09 70 72 69 6e 74 66 28 22  .{......printf("
0c90: 64 69 72 65 63 74 6f 72 79 20 25 73 20 63 61 6e  directory %s can
0ca0: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 5c 6e  not be created\n
0cb0: 22 2c 6e 61 6d 29 3b 71 74 28 31 29 3b 0a 09 09  ",nam);qt(1);...
0cc0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
0cd0: 09 09 09 09 7d 0a 09 09 09 69 66 28 28 66 66 20  ....}....if((ff 
0ce0: 3d 20 63 72 65 61 74 28 74 70 2c 30 36 36 36 29  = creat(tp,0666)
0cf0: 29 20 3c 20 30 29 67 6f 74 6f 20 65 72 66 3b 0a  ) < 0)goto erf;.
0d00: 09 09 09 2a 62 70 2b 2b 20 3d 20 69 74 79 70 65  ...*bp++ = itype
0d10: 3b 20 2a 62 70 2b 2b 20 3d 20 30 3b 20 2a 62 70  ; *bp++ = 0; *bp
0d20: 2b 2b 20 3d 20 30 3b 0a 09 09 09 2a 62 70 2b 2b  ++ = 0;....*bp++
0d30: 20 3d 20 4f 50 45 4e 3b 20 2a 62 70 2b 2b 20 3d   = OPEN; *bp++ =
0d40: 20 52 45 41 44 3b 20 2a 62 70 2b 2b 20 3d 20 43   READ; *bp++ = C
0d50: 4c 4f 53 45 3b 0a 09 09 09 69 66 28 72 64 28 6f  LOSE;....if(rd(o
0d60: 70 29 29 09 09 2f 2a 20 72 65 61 64 20 64 61 74  p))../* read dat
0d70: 61 20 61 6e 64 20 70 75 74 20 69 6e 20 66 69 6c  a and put in fil
0d80: 65 20 20 2a 2f 0a 09 09 09 09 67 6f 74 6f 20 63  e  */.....goto c
0d90: 6e 78 74 31 3b 09 09 2f 2a 20 61 6e 20 65 72 72  nxt1;../* an err
0da0: 6f 72 20 2a 2f 0a 09 09 6b 6e 78 74 3a 0a 2f 2a  or */...knxt:./*
0db0: 0a 09 09 09 62 70 20 3d 20 62 75 66 3b 20 2a 62  ....bp = buf; *b
0dc0: 70 2b 2b 20 3d 20 27 4b 27 3b 0a 09 09 09 2a 62  p++ = 'K';....*b
0dd0: 70 2b 2b 20 3d 20 28 73 75 6d 20 3e 3e 20 38 29  p++ = (sum >> 8)
0de0: 3b 20 2a 62 70 2b 2b 20 3d 20 28 73 75 6d 20 26  ; *bp++ = (sum &
0df0: 20 30 33 37 37 29 3b 0a 09 09 09 2a 62 70 2b 2b   0377);....*bp++
0e00: 20 3d 20 28 6c 65 6e 67 74 68 20 3e 3e 20 38 29   = (length >> 8)
0e10: 3b 20 2a 62 70 2b 2b 20 3d 20 28 6c 65 6e 67 74  ; *bp++ = (lengt
0e20: 68 20 26 20 30 33 37 37 29 3b 0a 09 09 09 69 66  h & 0377);....if
0e30: 28 73 65 6e 64 63 28 4f 4b 29 29 67 6f 74 6f 20  (sendc(OK))goto 
0e40: 63 6e 78 74 31 3b 0a 2a 2f 0a 09 09 63 6e 78 74  cnxt1;.*/...cnxt
0e50: 3a 0a 09 09 09 69 66 28 76 66 6c 61 67 29 70 72  :....if(vflag)pr
0e60: 69 6e 74 66 28 22 25 63 20 25 73 5c 6e 22 2c 6f  intf("%c %s\n",o
0e70: 70 2c 6e 61 6d 29 3b 0a 09 09 63 6e 78 74 31 3a  p,nam);...cnxt1:
0e80: 0a 09 09 09 63 6c 6f 73 65 28 66 66 29 3b 0a 09  ....close(ff);..
0e90: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
0ea0: 27 64 27 3a 0a 09 09 09 69 66 20 28 61 72 67 63  'd':....if (argc
0eb0: 20 3c 20 33 29 20 65 78 28 30 29 3b 0a 09 09 09   < 3) ex(0);....
0ec0: 78 66 6c 61 67 20 3d 20 31 3b 0a 09 09 09 69 66  xflag = 1;....if
0ed0: 20 28 28 78 64 69 72 28 31 29 20 3d 3d 20 31 29   ((xdir(1) == 1)
0ee0: 20 7c 7c 20 28 61 73 6b 28 29 29 29 20 62 72 65   || (ask())) bre
0ef0: 61 6b 3b 0a 09 09 09 2a 62 70 2b 2b 20 3d 20 44  ak;....*bp++ = D
0f00: 45 4c 45 54 45 3b 0a 09 09 73 69 6e 67 6c 65 3a  ELETE;...single:
0f10: 0a 09 09 09 69 66 28 28 21 73 65 6e 64 63 28 4f  ....if((!sendc(O
0f20: 4b 29 29 20 26 26 20 28 76 66 6c 61 67 29 29 09  K)) && (vflag)).
0f30: 09 2f 2a 20 73 65 6e 64 20 6a 75 73 74 20 61 20  ./* send just a 
0f40: 63 6f 6d 6d 61 6e 64 20 2d 6e 6f 20 64 61 74 61  command -no data
0f50: 20 20 2a 2f 0a 09 09 09 70 72 69 6e 74 66 28 22    */....printf("
0f60: 25 63 20 25 73 5c 6e 22 2c 6f 70 2c 6e 61 6d 29  %c %s\n",op,nam)
0f70: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
0f80: 73 65 20 27 73 27 3a 0a 09 09 09 66 6f 75 74 20  se 's':....fout 
0f90: 3d 20 31 3b 0a 09 09 09 73 70 73 74 61 74 28 29  = 1;....spstat()
0fa0: 3b 09 09 2f 2a 20 67 65 74 20 73 74 61 74 75 73  ;../* get status
0fb0: 20 66 72 6f 6d 20 66 69 6c 65 20 73 74 6f 72 65   from file store
0fc0: 20 20 2a 2f 0a 09 09 09 66 6f 75 74 20 3d 20 32    */....fout = 2
0fd0: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 0a 09 09 63  ;....break;....c
0fe0: 61 73 65 20 27 74 27 3a 0a 09 09 63 61 73 65 20  ase 't':...case 
0ff0: 27 6c 27 3a 0a 09 09 09 6e 78 74 20 3d 20 26 65  'l':....nxt = &e
1000: 6e 64 3b 0a 09 09 09 69 20 3d 20 78 64 69 72 28  nd;....i = xdir(
1010: 30 29 3b 0a 09 09 09 69 66 20 28 28 69 20 3d 3d  0);....if ((i ==
1020: 20 30 29 20 7c 7c 20 28 69 20 3d 3d 20 32 29 29   0) || (i == 2))
1030: 0a 09 09 09 09 7b 0a 09 09 09 09 66 6f 75 74 20  .....{.....fout 
1040: 3d 20 31 3b 0a 09 09 09 09 61 73 74 61 74 28 6f  = 1;.....astat(o
1050: 70 29 3b 0a 09 09 09 09 66 6f 75 74 20 3d 20 32  p);.....fout = 2
1060: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
1070: 09 7d 0a 09 09 09 69 66 20 28 69 20 3e 20 30 29  .}....if (i > 0)
1080: 0a 09 09 09 09 7b 0a 09 09 09 09 71 73 6f 72 74  .....{.....qsort
1090: 28 26 65 6e 64 2c 28 6e 78 74 20 2d 20 26 65 6e  (&end,(nxt - &en
10a0: 64 29 2f 31 34 2c 31 34 2c 63 6f 6d 70 61 72 29  d)/14,14,compar)
10b0: 3b 0a 09 09 09 09 66 6f 72 28 74 70 20 3d 20 26  ;.....for(tp = &
10c0: 65 6e 64 3b 20 74 70 20 3c 20 6e 78 74 3b 20 74  end; tp < nxt; t
10d0: 70 20 3d 2b 20 31 34 29 0a 09 09 09 09 09 7b 0a  p =+ 14)......{.
10e0: 09 09 09 09 09 61 70 70 65 6e 64 28 74 70 2c 73  .....append(tp,s
10f0: 70 5b 73 70 6f 73 5d 29 3b 6e 61 6d 65 28 66 73  p[spos]);name(fs
1100: 70 29 3b 0a 09 09 09 09 09 66 6f 75 74 20 3d 20  p);......fout = 
1110: 31 3b 0a 09 09 09 09 09 69 66 20 28 6f 70 20 3d  1;......if (op =
1120: 3d 20 27 74 27 29 20 70 72 69 6e 74 66 28 22 25  = 't') printf("%
1130: 73 5c 6e 22 2c 74 70 29 3b 0a 09 09 09 09 09 65  s\n",tp);......e
1140: 6c 73 65 20 61 73 74 61 74 28 6f 70 29 3b 0a 09  lse astat(op);..
1150: 09 09 09 09 66 6f 75 74 20 3d 20 32 3b 0a 09 09  ....fout = 2;...
1160: 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 62 72  ...}.....}....br
1170: 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
1180: 09 09 09 70 72 69 6e 74 66 28 22 69 6c 6c 65 67  ...printf("illeg
1190: 61 6c 20 6f 70 2d 63 6f 64 65 5c 6e 22 29 3b 0a  al op-code\n");.
11a0: 09 09 09 71 74 28 31 29 3b 0a 09 09 09 7d 0a 09  ...qt(1);....}..
11b0: 6e 78 74 61 72 67 3a 3b 0a 09 09 7d 0a 65 72 66  nxtarg:;...}.erf
11c0: 3a 0a 09 70 72 69 6e 74 66 28 22 25 73 20 3a 20  :..printf("%s : 
11d0: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 22 2c 74 70  cannot open ",tp
11e0: 29 3b 20 70 65 72 72 6f 72 28 22 22 29 3b 20 70  ); perror(""); p
11f0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 09 67 6f  rintf("\n");..go
1200: 74 6f 20 6e 78 74 61 72 67 3b 0a 09 7d 0a        to nxtarg;..}.