#ifndef _BYTEORDER_H_ #define _BYTEORDER_H_ 1 #define RW_PCVAL(read,inbuf,outbuf,len) \ if (read) { PCVAL (inbuf,0,outbuf,len) } \ else { PSCVAL(inbuf,0,outbuf,len) } #define RW_PIVAL(read,inbuf,outbuf,len) \ if (read) { PIVAL (inbuf,0,outbuf,len) } \ else { PSIVAL(inbuf,0,outbuf,len) } #define RW_PSVAL(read,inbuf,outbuf,len) \ if (read) { PSVAL (inbuf,0,outbuf,len) } \ else { PSSVAL(inbuf,0,outbuf,len) } #define RW_CVAL(read, inbuf, outbuf, offset) \ if (read) (outbuf) = CVAL (inbuf,offset); \ else SCVAL(inbuf,offset,outbuf); #define RW_IVAL(read, inbuf, outbuf, offset) \ if (read) (outbuf)= IVAL (inbuf,offset); \ else SIVAL(inbuf,offset,outbuf); #define RW_SVAL(read, inbuf, outbuf, offset) \ if (read) (outbuf)= SVAL (inbuf,offset); \ else SSVAL(inbuf,offset,outbuf); #undef CAREFUL_ALIGNMENT #ifndef CAREFUL_ALIGNMENT #define CAREFUL_ALIGNMENT 1 #endif #define CVAL(buf,pos) (((unsigned char *)(buf))[pos]) #define PVAL(buf,pos) ((unsigned)CVAL(buf,pos)) #define SCVAL(buf,pos,val) (CVAL(buf,pos) = (val)) #if CAREFUL_ALIGNMENT #define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8) #define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16) #define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8) #define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&0xFFFF),SSVALX(buf,pos+2,val>>16)) #define SVALS(buf,pos) ((short)SVAL(buf,pos)) #define IVALS(buf,pos) ((int)IVAL(buf,pos)) #define SSVAL(buf,pos,val) SSVALX((buf),(pos),((unsigned short)(val))) #define SIVAL(buf,pos,val) SIVALX((buf),(pos),((unsigned int)(val))) #define SSVALS(buf,pos,val) SSVALX((buf),(pos),((short)(val))) #define SIVALS(buf,pos,val) SIVALX((buf),(pos),((int)(val))) #else /* this handles things for architectures like the 386 that can handle alignment errors */ /* get single value from an SMB buffer */ #define SVAL(buf,pos) (*(unsigned short *)((char *)(buf) + (pos))) #define IVAL(buf,pos) (*(unsigned int *)((char *)(buf) + (pos))) #define SVALS(buf,pos) (*(short *)((char *)(buf) + (pos))) #define IVALS(buf,pos) (*(int *)((char *)(buf) + (pos))) /* store single value in an SMB buffer */ #define SSVAL(buf,pos,val) SVAL(buf,pos)=((unsigned short)(val)) #define SIVAL(buf,pos,val) IVAL(buf,pos)=((unsigned int)(val)) #define SSVALS(buf,pos,val) SVALS(buf,pos)=((short)(val)) #define SIVALS(buf,pos,val) IVALS(buf,pos)=((int)(val)) #endif /* macros for reading / writing arrays */ #define SMBMACRO(macro,buf,pos,val,len,size) \ { int l; for (l = 0; l < (len); l++) (val)[l] = macro((buf), (pos) + (size)*l); } #define SSMBMACRO(macro,buf,pos,val,len,size) \ { int l; for (l = 0; l < (len); l++) macro((buf), (pos) + (size)*l, (val)[l]); } /* reads multiple data from an SMB buffer */ #define PCVAL(buf,pos,val,len) SMBMACRO(CVAL,buf,pos,val,len,1) #define PSVAL(buf,pos,val,len) SMBMACRO(SVAL,buf,pos,val,len,2) #define PIVAL(buf,pos,val,len) SMBMACRO(IVAL,buf,pos,val,len,4) #define PCVALS(buf,pos,val,len) SMBMACRO(CVALS,buf,pos,val,len,1) #define PSVALS(buf,pos,val,len) SMBMACRO(SVALS,buf,pos,val,len,2) #define PIVALS(buf,pos,val,len) SMBMACRO(IVALS,buf,pos,val,len,4) /* stores multiple data in an SMB buffer */ #define PSCVAL(buf,pos,val,len) SSMBMACRO(SCVAL,buf,pos,val,len,1) #define PSSVAL(buf,pos,val,len) SSMBMACRO(SSVAL,buf,pos,val,len,2) #define PSIVAL(buf,pos,val,len) SSMBMACRO(SIVAL,buf,pos,val,len,4) #define PSCVALS(buf,pos,val,len) SSMBMACRO(SCVALS,buf,pos,val,len,1) #define PSSVALS(buf,pos,val,len) SSMBMACRO(SSVALS,buf,pos,val,len,2) #define PSIVALS(buf,pos,val,len) SSMBMACRO(SIVALS,buf,pos,val,len,4) /* now the reverse routines - these are used in nmb packets (mostly) */ #define SREV(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF)) #define IREV(x) ((SREV(x)<<16) | (SREV((x)>>16))) #define RSVAL(buf,pos) SREV(SVAL(buf,pos)) #define RIVAL(buf,pos) IREV(IVAL(buf,pos)) #define RSSVAL(buf,pos,val) SSVAL(buf,pos,SREV(val)) #define RSIVAL(buf,pos,val) SIVAL(buf,pos,IREV(val)) #endif /* _BYTEORDER_H_ */