aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/tapefs/tapfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/tapefs/tapfs.c')
-rw-r--r--src/cmd/tapefs/tapfs.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/cmd/tapefs/tapfs.c b/src/cmd/tapefs/tapfs.c
new file mode 100644
index 00000000..fb1738c2
--- /dev/null
+++ b/src/cmd/tapefs/tapfs.c
@@ -0,0 +1,115 @@
+#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;
+
+void
+populate(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);
+ }
+}
+
+long
+cvtime(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;
+}
+
+void
+popdir(Ram *r)
+{
+ USED(r);
+}
+
+void
+dotrunc(Ram *r)
+{
+ USED(r);
+}
+
+void
+docreate(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;
+}
+
+void
+dowrite(Ram *r, char *buf, long off, long cnt)
+{
+ USED(r); USED(buf); USED(off); USED(cnt);
+}
+
+int
+dopermw(Ram *r)
+{
+ USED(r);
+ return 0;
+}