📄 tapfs.c
字号:
#include <u.h>#include <libc.h>#include "tapefs.h"/* * File system for old tap tapes. */struct tap { unsigned char name[32]; unsigned char mode[1]; unsigned char uid[1]; unsigned char size[2]; unsigned char tmod[4]; unsigned char taddress[2]; unsigned char unused[20]; unsigned char checksum[2];} dir[192];int tapefile;char buffer[8192];long cvtime(unsigned char *);extern int verbose;extern int newtap;voidpopulate(char *name){ int i, isabs; struct tap *tpp; Fileinf f; replete = 1; tapefile = open(name, OREAD); if (tapefile<0) error("Can't open argument file"); read(tapefile, dir, sizeof dir); for (i=0, tpp=&dir[8]; i<192; i++, tpp++) { unsigned char *sp = (unsigned char *)tpp; int j, cksum = 0; for (j=0; j<32; j++, sp+=2) cksum += sp[0] + (sp[1]<<8); cksum &= 0xFFFF; if (cksum!=0) { print("cksum failure\n"); continue; } if (tpp->name[0]=='\0') continue; f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8); if (f.addr==0) continue; f.size = tpp->size[0] + (tpp->size[1]<<8); f.mdate = cvtime(tpp->tmod); f.mode = tpp->mode[0]&0777; f.uid = tpp->uid[0]&0377; isabs = tpp->name[0]=='/'; f.name = (char *)tpp->name+isabs; if (verbose) print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate)); poppath(f, 1); }}longcvtime(unsigned char *tp){ unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0); if (!newtap) { t /= 60; t += 3*365*24*3600; } return t;}voidpopdir(Ram *r){ USED(r);}voiddotrunc(Ram *r){ USED(r);}voiddocreate(Ram *r){ USED(r);}char *doread(Ram *r, vlong off, long cnt){ if (cnt>sizeof(buffer)) print("count too big\n"); seek(tapefile, 512*r->addr+off, 0); read(tapefile, buffer, cnt); return buffer;}voiddowrite(Ram *r, char *buf, long off, long cnt){ USED(r); USED(buf); USED(off); USED(cnt);}intdopermw(Ram *r){ USED(r); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -