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