|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stat.h> ! 3: #include <time.h> ! 4: #include <signal.h> ! 5: #include <stdio.h> ! 6: #define dbprintf printf ! 7: struct rt_dat { ! 8: unsigned short int rt_yr:5; /*Year - 1972 */ ! 9: unsigned short int rt_dy:5; /*day */ ! 10: unsigned short int rt_mo:5; /*month */ ! 11: }; ! 12: struct rt_axent { ! 13: char rt_sent[14]; ! 14: }; ! 15: ! 16: struct rt_ent { ! 17: char rt_pad; /*unusued */ ! 18: char rt_stat; /*Type of entry, or end of seg*/ ! 19: unsigned short rt_name[3]; /*Name, 3 words in rad50 form */ ! 20: short rt_len; /*Length of file */ ! 21: char rt_chan; /*Only used in temporary files*/ ! 22: char rt_job; /*Only used in temporary files*/ ! 23: struct rt_dat rt_date; /*Creation Date */ ! 24: }; ! 25: #define RT_TEMP 1 ! 26: #define RT_NULL 2 ! 27: #define RT_FILE 4 ! 28: #define RT_ESEG 8 ! 29: #define RT_BLOCK 512 ! 30: struct rt_head { ! 31: short rt_numseg; /*number of segments available*/ ! 32: short rt_nxtseg; /*segment no of next log. seg */ ! 33: short rt_lstseg; /*highest seg currenltly open */ ! 34: unsigned short rt_entpad; /*extra words/dir. entry */ ! 35: short rt_stfile; /*block no where files begin */ ! 36: }; ! 37: struct rt_dir { ! 38: struct rt_head rt_axhead; ! 39: struct rt_ent rt_ents[72]; ! 40: char _dirpad[6]; ! 41: }; ! 42: extern struct rt_dir rt_dir; ! 43: extern int rt_entsiz; ! 44: extern int floppydes; ! 45: extern char *rt_last; ! 46: typedef struct fldope { ! 47: int startad; ! 48: int count; ! 49: struct rt_ent *rtdope; ! 50: } FLDOPE; ! 51: FLDOPE *lookup(); ! 52: #define rt(p) ((struct rt_ent *) p ) ! 53: #define Ain1 03100 ! 54: #define Ain2 050 ! 55: #define flag(c) (flg[(c) - 'a']) ! 56: ! 57: char *man = { "rxtd" }; ! 58: ! 59: char zeroes[512]; ! 60: extern char *val; ! 61: extern char table[256]; ! 62: struct rt_dir rt_dir = {{4,0,1,0,14},{0,RT_NULL,{0,0,0},494,0}, {0,RT_ESEG}}; ! 63: int rt_entsiz; ! 64: int rt_nleft; ! 65: struct rt_ent *rt_curend; ! 66: int floppydes; ! 67: int dirdirty; ! 68: char *rt_last; ! 69: char *defdev = "/dev/floppy"; ! 70: ! 71: char *opt = { "vf" }; ! 72: ! 73: int signum[] = {SIGHUP, SIGINT, SIGQUIT, 0}; ! 74: long lseek(); ! 75: int rcmd(); ! 76: int dcmd(); ! 77: int xcmd(); ! 78: int tcmd(); ! 79: int (*comfun)(); ! 80: char flg[26]; ! 81: char **namv; ! 82: int namc; ! 83: int file; ! 84: ! 85: ! 86: main(argc, argv) ! 87: char *argv[]; ! 88: { ! 89: register char *cp; ! 90: ! 91: /*register i; ! 92: for(i=0; signum[i]; i++) ! 93: if(signal(signum[i], SIG_IGN) != SIG_IGN) ! 94: signal(signum[i], sigdone);*/ ! 95: if(argc < 2) ! 96: usage(); ! 97: cp = argv[1]; ! 98: for(cp = argv[1]; *cp; cp++) ! 99: switch(*cp) { ! 100: case 'm': ! 101: case 'v': ! 102: case 'u': ! 103: case 'w': ! 104: flg[*cp - 'a']++; ! 105: continue; ! 106: case 'c': ! 107: { ! 108: #define SURE "Are you sure you want to clobber the floppy?\n" ! 109: int tty; ! 110: char response[2]; ! 111: tty = open("/dev/tty",2); ! 112: write(tty,SURE,sizeof(SURE)); ! 113: read(tty,response,2); ! 114: if(*response!='y') ! 115: exit(50); ! 116: flag('c')++; ! 117: close(tty); ! 118: } ! 119: dirdirty++; ! 120: continue; ! 121: ! 122: case 'r': ! 123: setcom(rcmd); ! 124: flag('r')++; ! 125: continue; ! 126: ! 127: case 'd': ! 128: setcom(dcmd); ! 129: flag('d')++; ! 130: continue; ! 131: ! 132: case 'x': ! 133: setcom(xcmd); ! 134: continue; ! 135: ! 136: case 't': ! 137: setcom(tcmd); ! 138: continue; ! 139: ! 140: case 'f': ! 141: defdev = argv[2]; ! 142: argv++; ! 143: argc--; ! 144: continue; ! 145: ! 146: ! 147: default: ! 148: fprintf(stderr, "arff: bad option `%c'\n", *cp); ! 149: exit(1); ! 150: } ! 151: namv = argv+2; ! 152: namc = argc-2; ! 153: if(comfun == 0) { ! 154: if(flg['u'-'a'] == 0) { ! 155: fprintf(stderr, "arff: one of [%s] must be specified\n", man); ! 156: exit(1); ! 157: } ! 158: setcom(rcmd); ! 159: } ! 160: (*comfun)(); ! 161: exit(notfound()); ! 162: } ! 163: ! 164: setcom(fun) ! 165: int (*fun)(); ! 166: { ! 167: ! 168: if(comfun != 0) { ! 169: fprintf(stderr, "arff: only one of [%s] allowed\n", man); ! 170: exit(1); ! 171: } ! 172: comfun = fun; ! 173: } ! 174: ! 175: ! 176: ! 177: ! 178: ! 179: ! 180: ! 181: ! 182: usage() ! 183: { ! 184: printf("usage: ar [%s][%s] archive files ...\n", opt, man); ! 185: exit(1); ! 186: } ! 187: ! 188: ! 189: ! 190: notfound() ! 191: { ! 192: register i, n; ! 193: ! 194: n = 0; ! 195: for(i=0; i<namc; i++) ! 196: if(namv[i]) { ! 197: fprintf(stderr, "arff: %s not found\n", namv[i]); ! 198: n++; ! 199: } ! 200: return(n); ! 201: } ! 202: ! 203: ! 204: ! 205: phserr() ! 206: { ! 207: ! 208: fprintf(stderr, "arff: phase error on %s\n", file); ! 209: } ! 210: ! 211: mesg(c) ! 212: { ! 213: ! 214: if(flg['v'-'a']) ! 215: if(c != 'c' || flg['v'-'a'] > 1) ! 216: printf("%c - %s\n", c, file); ! 217: } ! 218: ! 219: tcmd() ! 220: { ! 221: register char *de; ! 222: FLDOPE *lookup(), *dope; ! 223: int nleft; register i; ! 224: register struct rt_ent *rde; ! 225: ! 226: rt_init(); ! 227: if(namc==0) ! 228: for(de=((char *)&rt_dir)+10; de <= rt_last; de += rt_entsiz) { ! 229: if(rtls(rt(de))) { ! 230: nleft = (rt_last - de) / rt_entsiz; ! 231: printf("\n\n%d entries remaining.\n",nleft); ! 232: break; ! 233: } ! 234: } ! 235: else ! 236: for(i = 0; i < namc; i++) { ! 237: if(dope = lookup(namv[i])) { ! 238: rde = dope->rtdope; ! 239: rtls(rde); ! 240: namv[i] = 0; ! 241: } ! 242: } ! 243: } ! 244: rtls(de) ! 245: register struct rt_ent *de; ! 246: { ! 247: int month,day,year; ! 248: char name[12], ext[4]; ! 249: ! 250: if(flg['v'-'a']) ! 251: switch(de->rt_stat) { ! 252: case RT_TEMP: ! 253: printf("Tempfile:\n"); ! 254: case RT_FILE: ! 255: unrad50(2,de->rt_name,name); ! 256: unrad50(1,&(de->rt_name[2]),ext); ! 257: day = de->rt_date.rt_dy; ! 258: year = de->rt_date.rt_yr + 72; ! 259: month = de->rt_date.rt_mo; ! 260: printf("%6.6s %3.3s %02d/%02d/%02d %d\n",name, ! 261: ext,month,day,year,de->rt_len); ! 262: break; ! 263: ! 264: case RT_NULL: ! 265: printf("%-25.9s %d\n","<UNUSED>",de->rt_len); ! 266: break; ! 267: ! 268: case RT_ESEG: ! 269: return(1); ! 270: } ! 271: else { ! 272: switch(de->rt_stat) { ! 273: case RT_TEMP: ! 274: case RT_FILE: ! 275: sunrad50(name,de->rt_name); ! 276: printf(name);putchar('\n'); ! 277: break; ! 278: ! 279: case RT_ESEG: ! 280: return(1); ! 281: ! 282: case RT_NULL: ! 283: ; ! 284: } ! 285: } ! 286: return(0); ! 287: } ! 288: xcmd() ! 289: { ! 290: register char *de; ! 291: char name[12]; ! 292: register int i; ! 293: ! 294: rt_init(); ! 295: if(namc==0) ! 296: for(de=((char *)&rt_dir)+10; de <= rt_last; de += rt_entsiz) { ! 297: sunrad50(name,rt(de)->rt_name); ! 298: rtx(name); ! 299: } ! 300: ! 301: else ! 302: for(i = 0; i < namc; i++) ! 303: if(rtx(namv[i])==0) namv[i] = 0; ! 304: } ! 305: rtx(name) ! 306: char *name; ! 307: { ! 308: register FLDOPE *dope; ! 309: FLDOPE *lookup(); ! 310: register startad, count; ! 311: int file; char buff[512]; ! 312: ! 313: ! 314: if(dope = lookup(name)) { ! 315: if(flg['v' - 'a']) ! 316: rtls(dope->rtdope); ! 317: else ! 318: printf("x - %s\n",name); ! 319: ! 320: file = creat(name, 0666); ! 321: if(file < 0) return(1); ! 322: count = dope->count; ! 323: startad = dope->startad; ! 324: for( ; count > 0 ; count -= 512) { ! 325: lread(startad,512,buff); ! 326: write(file,buff,512); ! 327: startad += 512; ! 328: } ! 329: close(file); ! 330: return(0); ! 331: } ! 332: return(1); ! 333: } ! 334: rt_init() ! 335: { ! 336: static initized = 0; ! 337: register char *de; ! 338: int mode; ! 339: ! 340: if(initized) return; ! 341: initized = 1; ! 342: if(flag('c') || flag('d') || flag('r')) ! 343: mode = 2; ! 344: else ! 345: mode = 0; ! 346: if((floppydes = open(defdev,mode)) < 0) ! 347: dbprintf("Floppy open failed\n"); ! 348: if(flag('c')==0) ! 349: lread(6*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir); ! 350: ! 351: rt_entsiz = 2*rt_dir.rt_axhead.rt_entpad + 14; ! 352: rt_entsiz = 14; ! 353: rt_last = ((char *) &rt_dir) + 10 + 1014/rt_entsiz*rt_entsiz; ! 354: for(de=((char *)&rt_dir)+10; de <= rt_last; de += rt_entsiz) { ! 355: if(rt(de)->rt_stat==RT_ESEG) break; ! 356: } ! 357: rt_curend = rt(de); ! 358: rt_nleft = (rt_last - de) / rt_entsiz; ! 359: } ! 360: ! 361: static FLDOPE result; ! 362: FLDOPE * ! 363: lookup(name) ! 364: char * name; ! 365: { ! 366: unsigned short rname[3]; ! 367: register char *de; ! 368: register index; ! 369: ! 370: srad50(name,rname); ! 371: ! 372: /* ! 373: * Search for name, accumulate blocks in index ! 374: */ ! 375: rt_init(); ! 376: index = 0; ! 377: for(de = ((char *) &rt_dir) + 10; de <= rt_last; de += rt_entsiz) { ! 378: switch(rt(de)->rt_stat) { ! 379: case RT_ESEG: ! 380: return((FLDOPE *) 0); ! 381: case RT_FILE: ! 382: case RT_TEMP: ! 383: if(samename(rname,rt(de)->rt_name)) ! 384: goto found; ! 385: case RT_NULL: ! 386: index += rt(de)->rt_len; ! 387: } ! 388: } ! 389: return((FLDOPE *) 0); ! 390: found: result.count = rt(de)->rt_len * 512; ! 391: result.startad = 512 * (rt_dir.rt_axhead.rt_stfile + index); ! 392: result.rtdope = (struct rt_ent *) de; ! 393: return(&result); ! 394: } ! 395: static ! 396: samename(a,b) ! 397: unsigned short a[3],b[3]; ! 398: { ! 399: return( a[0]==b[0] && a[1]==b[1] && a[2]==b[2] ); ! 400: } ! 401: ! 402: ! 403: rad50(cp,out) ! 404: register unsigned char *cp; ! 405: unsigned short *out; ! 406: { ! 407: register index; ! 408: register temp; ! 409: ! 410: for(index = 0;*cp; index++) { ! 411: ! 412: temp = Ain1 * table[*cp++]; ! 413: if(*cp!=0) { ! 414: temp += Ain2 * table[*cp++]; ! 415: ! 416: if(*cp!=0) ! 417: temp += table[*cp++]; ! 418: } ! 419: ! 420: out[index] = temp; ! 421: } ! 422: } ! 423: #define reduce(x,p,q) \ ! 424: (x = v[p/q], p %= q); ! 425: ! 426: unrad50(count,in,cp) ! 427: unsigned short *in; ! 428: register char *cp; ! 429: { ! 430: register i, temp; register unsigned char *v = (unsigned char *) val; ! 431: ! 432: for(i = 0; i < count; i++) { ! 433: temp = in[i]; ! 434: ! 435: reduce (*cp++,temp,Ain1); ! 436: reduce (*cp++,temp,Ain2); ! 437: reduce (*cp++,temp,1); ! 438: } ! 439: *cp=0; ! 440: } ! 441: ! 442: srad50(name,rname) ! 443: register char * name; ! 444: register unsigned short *rname; ! 445: { ! 446: register index; register char *cp; ! 447: char file[7],ext[4]; ! 448: /* ! 449: * Find end of pathname ! 450: */ ! 451: for(cp = name; *cp++; ); ! 452: while(cp >= name && *--cp != '/'); ! 453: cp++; ! 454: /* ! 455: * Change to rad50 ! 456: * ! 457: */ ! 458: for(index = 0; *cp; ){ ! 459: file[index++] = *cp++; ! 460: if(*cp=='.') { ! 461: cp++; ! 462: break; ! 463: } ! 464: if(index>=6) { ! 465: break; ! 466: } ! 467: } ! 468: file[index] = 0; ! 469: for(index = 0; *cp; ){ ! 470: ext[index++] = *cp++; ! 471: if(*cp=='.' || index>=3) { ! 472: break; ! 473: } ! 474: } ! 475: ext[index]=0; ! 476: rname[0] = 0; ! 477: rname[1] = 0; ! 478: rname[2] = 0; ! 479: rad50((unsigned char *)file,rname); ! 480: rad50((unsigned char *)ext,rname+2); ! 481: } ! 482: sunrad50(name,rname) ! 483: unsigned short rname[3]; ! 484: register char *name; ! 485: { ! 486: register char *cp, *cp2; ! 487: char ext[4]; ! 488: ! 489: unrad50(2,rname,name); ! 490: unrad50(1,rname + 2,ext); ! 491: /* Jam name and extension together with a dot ! 492: deleting white space */ ! 493: for(cp = name; *cp++;);--cp; while(*--cp==' ' && cp>=name); ! 494: *++cp = '.';cp++; ! 495: for(cp2=ext; *cp2!=' ' && cp2 < ext + 3;) { ! 496: *cp++ = *cp2++; ! 497: } ! 498: *cp=0; ! 499: if(cp[-1]=='.') cp[-1] = 0; ! 500: } ! 501: ! 502: static char *oval = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.@0123456789"; ! 503: static char *val = " abcdefghijklmnopqrstuvwxyz$.@0123456789"; ! 504: static char table[256] = { ! 505: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ! 506: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ! 507: 0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29, ! 508: 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29, ! 509: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ! 510: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, ! 511: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ! 512: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, ! 513: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ! 514: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, ! 515: 0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29, ! 516: 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29, ! 517: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ! 518: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, ! 519: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ! 520: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29 }; ! 521: ! 522: long trans(logical) ! 523: register int logical; ! 524: { ! 525: /* Logical to physical adress translation */ ! 526: register int sector, bytes, track; ! 527: ! 528: logical += 26 * 128; ! 529: bytes = (logical & 127); ! 530: logical >>= 7; ! 531: sector = logical % 26; ! 532: if(sector >= 13) ! 533: sector = sector *2 +1; ! 534: else ! 535: sector *= 2; ! 536: sector += 26 + ((track = (logical / 26)) - 1) * 6; ! 537: sector %= 26; ! 538: return( (((track *26) + sector) << 7) + bytes); ! 539: } ! 540: lread(startad,count,obuff) ! 541: register startad, count; ! 542: register char * obuff; ! 543: { ! 544: long trans(); ! 545: extern floppydes; ! 546: rt_init(); ! 547: if(flg['m'-'a']==0) ! 548: while( (count -= 128) >= 0) { ! 549: lseek(floppydes, trans(startad), 0); ! 550: read(floppydes,obuff,128); ! 551: obuff += 128; ! 552: startad += 128; ! 553: } ! 554: else ! 555: while( (count -= 512) >= 0) { ! 556: lseek(floppydes,(long) (startad), 0); ! 557: read(floppydes,obuff,512); ! 558: obuff += 512; ! 559: startad += 512; ! 560: } ! 561: } ! 562: lwrite(startad,count,obuff) ! 563: register startad, count; ! 564: register char * obuff; ! 565: { ! 566: long trans(); ! 567: extern floppydes; ! 568: rt_init(); ! 569: if(flg['m'-'a']==0) ! 570: while( (count -= 128) >= 0) { ! 571: lseek(floppydes, trans(startad), 0); ! 572: write(floppydes,obuff,128); ! 573: obuff += 128; ! 574: startad += 128; ! 575: } ! 576: else ! 577: while( (count -= 512) >= 0) { ! 578: lseek(floppydes,(long) (startad), 0); ! 579: write(floppydes,obuff,512); ! 580: obuff += 512; ! 581: startad += 512; ! 582: } ! 583: } ! 584: ! 585: rcmd() ! 586: { ! 587: register int i; ! 588: ! 589: rt_init(); ! 590: if(namc>0) ! 591: for(i = 0; i < namc; i++) ! 592: if(rtr(namv[i])==0) namv[i]=0; ! 593: ! 594: ! 595: } ! 596: ! 597: rtr(name) ! 598: char *name; ! 599: { ! 600: register FLDOPE *dope; register struct rt_ent *de; ! 601: struct stat buf; register struct stat *bufp = &buf; ! 602: ! 603: if(stat(name,bufp)<0) return(1); ! 604: if(dope = lookup(name)) { ! 605: /* can replace, no problem */ ! 606: de = dope->rtdope; ! 607: if(bufp->st_size <= (de->rt_len * 512)) ! 608: printf("r - %s\n",name), ! 609: toflop(name,bufp->st_size,dope); ! 610: else { ! 611: printf("%s will not fit in currently used file on floppy\n",name); ! 612: return(1); ! 613: } ! 614: } else { ! 615: /* Search for vacant spot */ ! 616: for(de = rt_dir.rt_ents; (char *) de <= rt_last; de++) { ! 617: switch((de)->rt_stat) { ! 618: case RT_NULL: ! 619: if(bufp->st_size <= (de->rt_len * 512)) { ! 620: printf("a - %s\n",name), ! 621: mkent(de,bufp,name); ! 622: goto found; ! 623: } ! 624: continue; ! 625: case RT_ESEG: ! 626: return(3); ! 627: } ! 628: } ! 629: return(5); ! 630: } ! 631: found: if(dope=lookup(name)) { ! 632: toflop(name,bufp->st_size,dope); ! 633: return(0); ! 634: } ! 635: return(7); ! 636: ! 637: } ! 638: mkent(de,bufp,name) ! 639: register struct rt_ent *de; ! 640: register struct stat *bufp; ! 641: char *name; ! 642: { ! 643: struct tm *localtime(); register struct tm *timp; ! 644: register struct rt_ent *workp; int count; ! 645: ! 646: count = (((bufp->st_size -1) >>9) + 1); ! 647: /* Make sure there is room */ ! 648: if(de->rt_len==count) ! 649: goto overwrite; ! 650: if(rt_nleft==0) { ! 651: if(flg['o'-'a']) ! 652: goto overwrite; ! 653: fprintf(stderr,"Directory full on %s\n",defdev); ! 654: exit(1); ! 655: } ! 656: /* copy directory entries up */ ! 657: for(workp = rt_curend+1; workp > de; workp--) ! 658: *workp = workp[-1]; ! 659: de[1].rt_len -= count; ! 660: de->rt_len = count; ! 661: rt_curend++; ! 662: rt_nleft--; ! 663: overwrite: ! 664: srad50(name,de->rt_name); ! 665: timp = localtime(&bufp->st_mtime); ! 666: de->rt_date.rt_dy = timp->tm_mday + 1; ! 667: de->rt_date.rt_mo = timp->tm_mon + 1; ! 668: de->rt_date.rt_yr = timp->tm_year - 72; ! 669: de->rt_stat = RT_FILE; ! 670: de->rt_pad = 0; ! 671: de->rt_chan = 0; ! 672: de->rt_job = 0; ! 673: lwrite(6*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir); ! 674: ! 675: } ! 676: ! 677: toflop(name,ocount,dope) ! 678: char *name; ! 679: register FLDOPE *dope; ! 680: long ocount; ! 681: { ! 682: register file, n, startad = dope->startad, count = ocount; ! 683: char buff[512]; ! 684: ! 685: file = open(name,0); ! 686: if(file < 0) { ! 687: printf("arff: couldn't open %s\n",name);exit(1);} ! 688: for( ; count >= 512; count -= 512) { ! 689: read(file,buff,512); ! 690: lwrite(startad,512,buff); ! 691: startad += 512; ! 692: } ! 693: read(file,buff,count); ! 694: close(file); ! 695: if(count <= 0) return; ! 696: for(n = count; n < 512; n ++) buff[n] = 0; ! 697: lwrite(startad,512,buff); ! 698: count = (dope->rtdope->rt_len * 512 - ocount) / 512 ; ! 699: if(count <= 0) return; ! 700: for( ; count > 0 ; count--) { ! 701: startad += 512; ! 702: lwrite(startad,512,zeroes); ! 703: } ! 704: ! 705: } ! 706: dcmd() ! 707: { ! 708: register int i; ! 709: ! 710: rt_init(); ! 711: if(namc) ! 712: for(i = 0; i < namc; i++) ! 713: if(rtk(namv[i])==0) namv[i]=0; ! 714: if(dirdirty) ! 715: scrunch(); ! 716: ! 717: } ! 718: rtk(name) ! 719: char *name; ! 720: { ! 721: register FLDOPE *dope; ! 722: register struct rt_ent *de; ! 723: FLDOPE *lookup(); ! 724: ! 725: if(dope = lookup(name)) { ! 726: printf("d - %s\n",name); ! 727: de = dope->rtdope; ! 728: de->rt_stat = RT_NULL; ! 729: de->rt_name[0] = 0; ! 730: de->rt_name[1] = 0; ! 731: de->rt_name[2] = 0; ! 732: * ((unsigned short *) & (de->rt_date)) = 0; ! 733: dirdirty = 1; ! 734: return(0); ! 735: } ! 736: return(1); ! 737: } ! 738: scrunch() { ! 739: register struct rt_ent *de = rt_dir.rt_ents, *workp; ! 740: for(de = rt_dir.rt_ents; de <= rt_curend; de++) { ! 741: if(de->rt_stat==RT_NULL && de[1].rt_stat==RT_NULL) { ! 742: (de+1)->rt_len += de->rt_len; ! 743: for(workp = de; workp < rt_curend; workp++) ! 744: *workp = workp[1]; ! 745: de--; ! 746: rt_curend--; ! 747: rt_nleft++; ! 748: } ! 749: } ! 750: lwrite(6*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir); ! 751: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.