Mercurial > hg > Members > kono > os9 > sbc09
comparison vdisk.c @ 48:ea1b17311bf3
dir /v0 worked but dir /v0/src and chd /v0; dir does not
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 20 Jul 2018 21:28:57 +0900 |
parents | 15f1e1b49928 |
children | 947cbecdd8d5 |
comparison
equal
deleted
inserted
replaced
47:15f1e1b49928 | 48:ea1b17311bf3 |
---|---|
60 drvRoot[drv] = name; | 60 drvRoot[drv] = name; |
61 return 0; | 61 return 0; |
62 } | 62 } |
63 | 63 |
64 void closepd(PathDesc *pd) { | 64 void closepd(PathDesc *pd) { |
65 int err = fclose(pd->fp) ; | 65 if(pd->fp) fclose(pd->fp) ; |
66 pd->dir = 0; | |
66 pd->use = 0; | 67 pd->use = 0; |
67 pd->fp = 0; | 68 pd->fp = 0; |
68 pd->mode = 0; | 69 pd->mode = 0; |
69 free(pd->dirfp); pd->dirfp = 0; | 70 free(pd->dirfp); pd->dirfp = 0; |
70 free(pd->name); pd->name = 0; | 71 free(pd->name); pd->name = 0; |
71 free(pd->fd); pd->fd = 0; | |
72 } | 72 } |
73 | 73 |
74 #define MAXPAHTLEN 256 | 74 #define MAXPAHTLEN 256 |
75 | 75 |
76 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { | 76 char *addCurdir(char *name, PathDesc *pd, PathDesc *curdir) { |
83 int ps = ns; | 83 int ps = ns; |
84 char *base ; | 84 char *base ; |
85 if (name[0]-='/') { | 85 if (name[0]-='/') { |
86 base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; | 86 base = drvRoot[pd->drv]; ps += strlen(drvRoot[pd->drv])+1; |
87 } else if (name[0]==0) { | 87 } else if (name[0]==0) { |
88 return drvRoot[pd->drv]; | 88 base = drvRoot[pd->drv]; |
89 char *path = (char*)malloc(strlen(base)+1); // we'll free this, malloc it. | |
90 int i = 0; | |
91 for(;base[i];i++) path[i] = base[i]; | |
92 path[i]=0; | |
93 return path; | |
89 } else { | 94 } else { |
90 name++; base = curdir->name; ps += strlen(curdir->name)+1; | 95 name++; base = curdir->name; ps += strlen(curdir->name)+1; |
91 } | 96 } |
92 char *path = (char*)malloc(ps+1); | 97 char *path = (char*)malloc(ps+1); |
93 int i = 0; | 98 int i = 0; |
185 | 190 |
186 /* read direcotry entry */ | 191 /* read direcotry entry */ |
187 int os9opendir(PathDesc *pd) { | 192 int os9opendir(PathDesc *pd) { |
188 DIR *dir; | 193 DIR *dir; |
189 struct dirent *dp; | 194 struct dirent *dp; |
195 if (pd->dirfp) return 0; // already opened | |
190 dir = opendir(pd->name); | 196 dir = opendir(pd->name); |
191 if (dir==0) return -1; | 197 if (dir==0) return -1; |
192 int dircount = 0; | 198 int dircount = 0; |
193 while ((dp = readdir(dir)) != NULL) dircount++; // pass 1 to determine the size | 199 while ((dp = readdir(dir)) != NULL) dircount++; // pass 1 to determine the size |
194 if (dircount==0) return 0; // should contains . and .. at least | 200 if (dircount==0) return 0; // should contains . and .. at least |
197 rewinddir(dir); | 203 rewinddir(dir); |
198 int i = 0; | 204 int i = 0; |
199 while ((dp = readdir(dir)) != NULL) { | 205 while ((dp = readdir(dir)) != NULL) { |
200 int j = 0; | 206 int j = 0; |
201 for(j = 0; j < DIR_NM ; j++) { | 207 for(j = 0; j < DIR_NM ; j++) { |
202 if (j< dp->d_namlen) | 208 if (j< dp->d_namlen) { |
203 pd->dirfp[i+j] = dp->d_name[j]; | 209 pd->dirfp[i+j] = dp->d_name[j]&0x7f; |
204 else | 210 if (j== dp->d_namlen-1) |
211 pd->dirfp[i+j] |= 0x80; // os9 EOL | |
212 } else | |
205 pd->dirfp[i+j] = 0; | 213 pd->dirfp[i+j] = 0; |
206 } | 214 } |
207 pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16; | 215 pd->dirfp[i+j] = (dp->d_ino&0xff0000)>>16; |
208 pd->dirfp[i+j+1] = (dp->d_ino&0xff00)>>8; | 216 pd->dirfp[i+j+1] = (dp->d_ino&0xff00)>>8; |
209 pd->dirfp[i+j+2] = dp->d_ino&0xff; | 217 pd->dirfp[i+j+2] = dp->d_ino&0xff; |
285 int err; | 293 int err; |
286 PathDesc *curdir = pdv+mem[0x44+IOPAGE]; // garbage until set | 294 PathDesc *curdir = pdv+mem[0x44+IOPAGE]; // garbage until set |
287 Byte attr ; | 295 Byte attr ; |
288 Word u = (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE]; // caller's stack in system segment | 296 Word u = (mem[0x45+IOPAGE]<<8)+mem[0x46+IOPAGE]; // caller's stack in system segment |
289 xreg = (*smem(u+4)<<8)+*smem(u+5); | 297 xreg = (*smem(u+4)<<8)+*smem(u+5); |
298 yreg = (*smem(u+6)<<8)+*smem(u+7); | |
290 *areg = *smem(u+1); | 299 *areg = *smem(u+1); |
291 *breg = *smem(u+2); | 300 *breg = *smem(u+2); |
292 Byte mode = yreg&0xff; | 301 Byte mode = yreg&0xff; |
293 Byte *os9pd = smem((mem[0x47+IOPAGE]<<8)+mem[0x48+IOPAGE]); | 302 Byte *os9pd = smem((mem[0x47+IOPAGE]<<8)+mem[0x48+IOPAGE]); |
294 PathDesc *pd = pdv+*os9pd; | 303 PathDesc *pd = pdv+*os9pd; |
414 * B = errcode | 423 * B = errcode |
415 */ | 424 */ |
416 case 0xd4: | 425 case 0xd4: |
417 path = (char*)umem(xreg); | 426 path = (char*)umem(xreg); |
418 next = checkFileName(path,pd,curdir); | 427 next = checkFileName(path,pd,curdir); |
419 if (next!=0 && os9opendir(pd)) { | 428 if (next!=0 && os9opendir(pd)==0) { |
420 if (curdir!=pd) closepd(curdir); | 429 if (curdir!=pd) closepd(curdir); |
421 if (pd->name != path) { | |
422 free(path); | |
423 } | |
424 xreg += ( next - path ); | 430 xreg += ( next - path ); |
425 *areg = pd->num; | 431 *areg = pd->num; |
426 pd->use = 1; | 432 pd->use = 1; |
427 *breg = 0; | 433 *breg = 0; |
428 break; | 434 break; |
468 * Error: CC Carry set | 474 * Error: CC Carry set |
469 * B = errcode | 475 * B = errcode |
470 */ | 476 */ |
471 case 0xd6: { | 477 case 0xd6: { |
472 *breg = 0xff; | 478 *breg = 0xff; |
473 if (pd==0) break; | |
474 off_t seek = (xreg<<16)+yreg; | 479 off_t seek = (xreg<<16)+yreg; |
475 *breg = fseek(pd->fp,(off_t)seek,SEEK_SET); | 480 *breg = fseek(pd->fp,(off_t)seek,SEEK_SET); |
476 break; | 481 break; |
477 } | 482 } |
478 /* | 483 /* |
493 * | 498 * |
494 * | 499 * |
495 */ | 500 */ |
496 case 0xd7: | 501 case 0xd7: |
497 *breg = 0xff; | 502 *breg = 0xff; |
498 if (pd==0) break; | |
499 if (pd->dir) break; | |
500 buf = (char*)umem(xreg); | 503 buf = (char*)umem(xreg); |
501 if (fgets(buf,yreg,pd->fp)) { | 504 char *b; |
502 int len = yreg; | 505 if ((b=fgets(buf,yreg,pd->fp))) { |
506 // set y | |
507 *smem(u+6) = (err>>8)&0xff; | |
508 *smem(u+7) = err&0xff; | |
509 if (b==0) { | |
510 *breg = 0xd3; | |
511 break; | |
512 } | |
513 int len = err; | |
503 int i; | 514 int i; |
504 for(i=0;i<len && buf[i];i++); | 515 for(i=0;i<len && buf[i];i++); |
505 if (i>0 && buf[i-1]=='\n') { | 516 if (i>0 && buf[i-1]=='\n') { |
506 buf[i-1] = '\r'; | 517 buf[i-1] = '\r'; |
507 yreg = i; | 518 yreg = i; |
520 * Error: CC Carry set | 531 * Error: CC Carry set |
521 * B = errcode | 532 * B = errcode |
522 */ | 533 */ |
523 case 0xd8: | 534 case 0xd8: |
524 *breg = 0xff; | 535 *breg = 0xff; |
525 if (pd==0) break; | |
526 buf = (char*)umem(xreg); | 536 buf = (char*)umem(xreg); |
527 err = fread(buf,yreg,1,pd->fp); | 537 int i = fread(buf,1,yreg,pd->fp); |
528 *breg = err==0?0xff:0 ; | 538 // set y |
529 yreg = err ; | 539 *smem(u+6) = (i>>8)&0xff; |
540 *smem(u+7) = i&0xff; | |
541 *breg = (i==0?0xd3:0) ; | |
530 break; | 542 break; |
531 | 543 |
532 /* | 544 /* |
533 * I$WritLn Entry Point | 545 * I$WritLn Entry Point |
534 * | 546 * |
542 * Y number of bytes written | 554 * Y number of bytes written |
543 * | 555 * |
544 * Error: CC Carry set | 556 * Error: CC Carry set |
545 * B = errcode | 557 * B = errcode |
546 */ | 558 */ |
547 case 0xd9: | 559 case 0xd9: { |
548 *breg = 0xff; | 560 *breg = 0xff; |
549 if (pd==0) break; | |
550 if (pd->dir) break; | 561 if (pd->dir) break; |
551 int len = yreg; | 562 int len = yreg; |
552 int i = 0; | 563 int i = 0; |
553 Byte *buf = umem(xreg); | 564 Byte *buf = umem(xreg); |
554 while(len>0 && *buf !='\r') { | 565 while(len>0 && *buf !='\r') { |
558 if (buf[i]=='\r') { | 569 if (buf[i]=='\r') { |
559 fputc('\n',pd->fp); | 570 fputc('\n',pd->fp); |
560 i++; | 571 i++; |
561 } | 572 } |
562 *breg = 0; | 573 *breg = 0; |
563 yreg = i; | 574 // set y |
575 *smem(u+6) = (i>>8)&0xff; | |
576 *smem(u+7) = i&0xff; | |
564 break; | 577 break; |
578 } | |
565 | 579 |
566 /* | 580 /* |
567 * I$Write Entry Point | 581 * I$Write Entry Point |
568 * | 582 * |
569 * Entry: | 583 * Entry: |
576 case 0xda : | 590 case 0xda : |
577 *breg = 0xff; | 591 *breg = 0xff; |
578 if (!pd->dir) { | 592 if (!pd->dir) { |
579 Byte *buf = umem(xreg); | 593 Byte *buf = umem(xreg); |
580 int len = yreg; | 594 int len = yreg; |
581 int err = fwrite(buf,len,1,pd->fp); | 595 int err = fwrite(buf,1,len,pd->fp); |
582 *breg = err?0xff:0; | 596 *breg = err?0xff:0; |
583 yreg = err; | 597 // set y |
598 *smem(u+6) = (i>>8)&0xff; | |
599 *smem(u+7) = i&0xff; | |
584 } | 600 } |
585 break; | 601 break; |
586 | 602 |
587 /* I$Close Entry Point | 603 /* I$Close Entry Point |
588 * | 604 * |
644 * R$X=Pointer to a 256 byte buffer | 660 * R$X=Pointer to a 256 byte buffer |
645 * R$Y=# bytes of FD required | 661 * R$Y=# bytes of FD required |
646 * this should be handled in vrbf | 662 * this should be handled in vrbf |
647 */ | 663 */ |
648 *breg = 0xff; | 664 *breg = 0xff; |
649 yreg = (*smem(u+6)<<8)+*smem(u+7); | |
650 if (pd==0) break; | 665 if (pd==0) break; |
651 *breg = filedescriptor(umem(xreg), yreg,pd) ; | 666 *breg = filedescriptor(umem(xreg), yreg,pd) ; |
652 break; | 667 break; |
653 case 0x20: // Pos.FDInf mandatry for dir command | 668 case 0x20: // Pos.FDInf mandatry for dir command |
654 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere | 669 /* SS.FDInf ($20) - Directly reads a file descriptor from anywhere |
660 * LSB - MSB of logical sector # | 675 * LSB - MSB of logical sector # |
661 * R$U= LSW of logical sector # | 676 * R$U= LSW of logical sector # |
662 */ | 677 */ |
663 *breg = 0xff; | 678 *breg = 0xff; |
664 if (pd==0) break; | 679 if (pd==0) break; |
665 yreg = (*smem(u+6)<<8)+*smem(u+7); | |
666 ureg = (*smem(u+8)<<8)+*smem(u+9); | 680 ureg = (*smem(u+8)<<8)+*smem(u+9); |
667 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); | 681 *breg = fdinfo(pmem(xreg),yreg,xreg*0x10000+ureg,pd); |
668 break; | 682 break; |
669 default: | 683 default: |
670 *breg = 0xff; | 684 *breg = 0xff; |