URI:
       tconvD2M.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
       ---
       tconvD2M.c (1495B)
       ---
            1 #include        <u.h>
            2 #include        <libc.h>
            3 #include        <fcall.h>
            4 
            5 uint
            6 sizeD2M(Dir *d)
            7 {
            8         char *sv[5];
            9         int i, ns, nstr, fixlen;
           10 
           11         sv[0] = d->name;
           12         sv[1] = d->uid;
           13         sv[2] = d->gid;
           14         sv[3] = d->muid;
           15 
           16         fixlen = STATFIXLEN;
           17         nstr = 4;
           18 
           19         ns = 0;
           20         for(i = 0; i < nstr; i++)
           21                 if(sv[i])
           22                         ns += strlen(sv[i]);
           23 
           24         return fixlen + ns;
           25 }
           26 
           27 uint
           28 convD2M(Dir *d, uchar *buf, uint nbuf)
           29 {
           30         uchar *p, *ebuf;
           31         char *sv[5];
           32         int i, ns, nsv[5], ss, nstr, fixlen;
           33 
           34         if(nbuf < BIT16SZ)
           35                 return 0;
           36 
           37         p = buf;
           38         ebuf = buf + nbuf;
           39 
           40         sv[0] = d->name;
           41         sv[1] = d->uid;
           42         sv[2] = d->gid;
           43         sv[3] = d->muid;
           44 
           45         fixlen = STATFIXLEN;
           46         nstr = 4;
           47 
           48         ns = 0;
           49         for(i = 0; i < nstr; i++){
           50                 if(sv[i])
           51                         nsv[i] = strlen(sv[i]);
           52                 else
           53                         nsv[i] = 0;
           54                 ns += nsv[i];
           55         }
           56 
           57         ss = fixlen + ns;
           58 
           59         /* set size befor erroring, so user can know how much is needed */
           60         /* note that length excludes count field itself */
           61         PBIT16(p, ss-BIT16SZ);
           62         p += BIT16SZ;
           63 
           64         if(ss > nbuf)
           65                 return BIT16SZ;
           66 
           67         PBIT16(p, d->type);
           68         p += BIT16SZ;
           69         PBIT32(p, d->dev);
           70         p += BIT32SZ;
           71         PBIT8(p, d->qid.type);
           72         p += BIT8SZ;
           73         PBIT32(p, d->qid.vers);
           74         p += BIT32SZ;
           75         PBIT64(p, d->qid.path);
           76         p += BIT64SZ;
           77         PBIT32(p, d->mode);
           78         p += BIT32SZ;
           79         PBIT32(p, d->atime);
           80         p += BIT32SZ;
           81         PBIT32(p, d->mtime);
           82         p += BIT32SZ;
           83         PBIT64(p, d->length);
           84         p += BIT64SZ;
           85 
           86         for(i = 0; i < nstr; i++){
           87                 ns = nsv[i];
           88                 if(p + ns + BIT16SZ > ebuf)
           89                         return 0;
           90                 PBIT16(p, ns);
           91                 p += BIT16SZ;
           92                 if(ns)
           93                         memmove(p, sv[i], ns);
           94                 p += ns;
           95         }
           96 
           97         if(ss != p - buf)
           98                 return 0;
           99 
          100         return p - buf;
          101 }