]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/xd.c
ip/cifsd: dont return garbage in upper 32 bit of unix extension stat fields
[plan9front.git] / sys / src / cmd / xd.c
old mode 100755 (executable)
new mode 100644 (file)
index dcbc2f2..76d08df
@@ -7,7 +7,7 @@ unsigned char   data[16];
 int            ndata;
 unsigned long  addr;
 int            repeats;
-int            swizzle;
+int            le;     /* little endian */
 int            flush;
 int            abase=2;
 int            xd(char *, int);
@@ -58,6 +58,13 @@ char *afmt[2][3] = {
 Biobuf bin;
 Biobuf bout;
 
+int
+flushout(Biobufhdr *bp, void *v, long n)
+{
+       Bflush(&bout);
+       return read(bp->fid, v, n);
+}
+
 void
 main(int argc, char *argv[])
 {
@@ -65,6 +72,7 @@ main(int argc, char *argv[])
        Arg *ap;
 
        Binit(&bout, 1, OWRITE);
+       Blethal(&bout, nil);
        err = 0;
        ap = 0;
        while(argc>1 && argv[1][0]=='-' && argv[1][1]){
@@ -78,7 +86,7 @@ main(int argc, char *argv[])
                        continue;
                }
                if(argv[0][0] == 's'){
-                       swizzle = 1;
+                       le = 1;
                        if(argv[0][1])
                                goto Usage;
                        continue;
@@ -205,6 +213,8 @@ xd(char *name, int title)
                bp = &bin;
                Binit(bp, fd, OREAD);
        }
+       if(flush) Biofn(bp, flushout);
+       Blethal(bp, nil);
        if(title)
                xprint("%s\n", name);
        addr = 0;
@@ -213,8 +223,6 @@ xd(char *name, int title)
                if(ndata < 16)
                        for(i=ndata; i<16; i++)
                                data[i] = 0;
-               if(swizzle)
-                       swizz();
                if(ndata==16 && repeats){
                        if(addr>0 && data[0]==odata[0]){
                                for(i=1; i<16; i++)
@@ -237,15 +245,11 @@ xd(char *name, int title)
                        xprint(ap->afmt, addr);
                        (*ap->fn)(ap->fmt);
                        xprint("\n", 0);
-                       if(flush)
-                               Bflush(&bout);
                }
                addr += ndata;
                if(ndata<16){
                        xprint(afmt[0][abase], addr);
                        xprint("\n", 0);
-                       if(flush)
-                               Bflush(&bout);
                        break;
                }
        }
@@ -253,29 +257,6 @@ xd(char *name, int title)
        return 0;
 }
 
-void
-swizz(void)
-{
-       uchar *p, *q;
-       int i;
-       uchar swdata[16];
-
-       p = data;
-       q = swdata;
-       for(i=0; i<16; i++)
-               *q++ = *p++;
-       p = data;
-       q = swdata;
-       for(i=0; i<4; i++){
-               p[0] = q[3];
-               p[1] = q[2];
-               p[2] = q[1];
-               p[3] = q[0];
-               p += 4;
-               q += 4;
-       }
-}
-
 void
 fmt0(char *f)
 {
@@ -289,7 +270,8 @@ fmt1(char *f)
 {
        int i;
        for(i=0; i<ndata; i+=sizeof(unsigned short))
-               xprint(f, (data[i]<<8)|data[i+1]);
+               xprint(f, le ? (data[i+1]<<8)|data[i]
+                            : (data[i]<<8)|data[i+1]);
 }
 
 void
@@ -297,7 +279,8 @@ fmt2(char *f)
 {
        int i;
        for(i=0; i<ndata; i+=sizeof(unsigned long))
-               xprint(f, (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
+               xprint(f, le ? (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i]
+                            : (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3]);
 }
 
 void
@@ -306,9 +289,15 @@ fmt3(char *f)
        int i;
        unsigned long long v;
        for(i=0; i<ndata; i+=sizeof(unsigned long long)){
-               v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
-               v <<= 32;
-               v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
+               if(le){
+                       v = (data[i+3+4]<<24)|(data[i+2+4]<<16)|(data[i+1+4]<<8)|data[i+4];
+                       v <<= 32;
+                       v |= (data[i+3]<<24)|(data[i+2]<<16)|(data[i+1]<<8)|data[i];
+               }else{
+                       v = (data[i]<<24)|(data[i+1]<<16)|(data[i+2]<<8)|data[i+3];
+                       v <<= 32;
+                       v |= (data[i+4]<<24)|(data[i+1+4]<<16)|(data[i+2+4]<<8)|data[i+3+4];
+               }
                if(Bprint(&bout, f, v)<0){
                        fprint(2, "xd: i/o error\n");
                        exits("i/o error");