URI:
       ttpfs.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       ttpfs.c (1999B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include "tapefs.h"
            4 
            5 /*
            6  * File system for tp tapes.  dectape versions have 192
            7  * entries, magtape have 496.  This treats the same
            8  * by ignoring entries with bad header checksums
            9  */
           10 
           11 struct tp {
           12         unsigned char        name[32];
           13         unsigned char        mode[2];
           14         unsigned char        uid[1];
           15         unsigned char        gid[1];
           16         unsigned char        unused[1];
           17         unsigned char        size[3];
           18         unsigned char        tmod[4];
           19         unsigned char        taddress[2];
           20         unsigned char        unused2[16];
           21         unsigned char        checksum[2];
           22 } dir[496+8];
           23 
           24 char        buffer[8192];
           25 int        tapefile;
           26 
           27 void
           28 populate(char *name)
           29 {
           30         int i, isabs, badcksum, goodcksum;
           31         struct tp *tpp;
           32         Fileinf f;
           33 
           34         replete = 1;
           35         tapefile = open(name, OREAD);
           36         if (tapefile<0)
           37                 error("Can't open argument file");
           38         read(tapefile, dir, sizeof dir);
           39         badcksum = goodcksum = 0;
           40         for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
           41                 unsigned char *sp = (unsigned char *)tpp;
           42                 int j, cksum = 0;
           43                 for (j=0; j<32; j++, sp+=2)
           44                         cksum += sp[0] + (sp[1]<<8);
           45                 cksum &= 0xFFFF;
           46                 if (cksum!=0) {
           47                         badcksum++;
           48                         continue;
           49                 }
           50                 goodcksum++;
           51                 if (tpp->name[0]=='\0')
           52                         continue;
           53                 f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
           54                 if (f.addr==0)
           55                         continue;
           56                 f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
           57                 f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
           58                      +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
           59                 f.mode = tpp->mode[0]&0777;
           60                 f.uid = tpp->uid[0];
           61                 f.gid = tpp->gid[0];
           62                 isabs = tpp->name[0]=='/';
           63                 f.name = (char *)tpp->name+isabs;
           64                 poppath(f, 1);
           65         }
           66         fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
           67 }
           68 
           69 void
           70 popdir(Ram *r)
           71 {
           72         USED(r);
           73 }
           74 
           75 void
           76 dotrunc(Ram *r)
           77 {
           78         USED(r);
           79 }
           80 
           81 void
           82 docreate(Ram *r)
           83 {
           84         USED(r);
           85 }
           86 
           87 char *
           88 doread(Ram *r, vlong off, long cnt)
           89 {
           90         if (cnt>sizeof(buffer))
           91                 print("count too big\n");
           92         seek(tapefile, 512*r->addr+off, 0);
           93         read(tapefile, buffer, cnt);
           94         return buffer;
           95 }
           96 
           97 void
           98 dowrite(Ram *r, char *buf, long off, long cnt)
           99 {
          100         USED(r); USED(buf); USED(off); USED(cnt);
          101 }
          102 
          103 int
          104 dopermw(Ram *r)
          105 {
          106         USED(r);
          107         return 0;
          108 }