X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/a1d73ea7ee29b89184a4e367b7169a18ff13d3e2..2cfe2bf4a5bdba199215e4c92129a36271b10a64:/smbutil.c diff --git a/smbutil.c b/smbutil.c index ab5afbf4..92ae88ec 100644 --- a/smbutil.c +++ b/smbutil.c @@ -1,9 +1,10 @@ /* - Copyright (C) Andrew Tridgell 1995-1999 - - This software may be distributed either under the terms of the - BSD-style license that accompanies tcpdump or the GNU GPL version 2 - or later */ + * Copyright (C) Andrew Tridgell 1995-1999 + * + * This software may be distributed either under the terms of the + * BSD-style license that accompanies tcpdump or the GNU GPL version 2 + * or later + */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -11,7 +12,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.15 2001-06-25 18:58:09 itojun Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.16 2001-06-25 21:04:01 itojun Exp $"; #endif #include @@ -19,7 +20,6 @@ static const char rcsid[] = #include #include - #include #include @@ -33,307 +33,329 @@ static const char rcsid[] = extern const uchar *startbuf; -/******************************************************************* - interpret a 32 bit dos packed date/time to some parameters -********************************************************************/ -static void interpret_dos_date(uint32 date,int *year,int *month,int *day,int *hour,int *minute,int *second) +/* + * interpret a 32 bit dos packed date/time to some parameters + */ +static void +interpret_dos_date(uint32 date, struct tm *tp) { - uint32 p0,p1,p2,p3; - - p0=date&0xFF; p1=((date&0xFF00)>>8)&0xFF; - p2=((date&0xFF0000)>>16)&0xFF; p3=((date&0xFF000000)>>24)&0xFF; - - *second = 2*(p0 & 0x1F); - *minute = ((p0>>5)&0xFF) + ((p1&0x7)<<3); - *hour = (p1>>3)&0xFF; - *day = (p2&0x1F); - *month = ((p2>>5)&0xFF) + ((p3&0x1)<<3) - 1; - *year = ((p3>>1)&0xFF) + 80; + uint32 p0, p1, p2, p3; + + p0 = date & 0xFF; + p1 = ((date & 0xFF00) >> 8) & 0xFF; + p2 = ((date & 0xFF0000) >> 16) & 0xFF; + p3 = ((date & 0xFF000000) >> 24) & 0xFF; + + tp->tm_sec = 2 * (p0 & 0x1F); + tp->tm_min = ((p0 >> 5) & 0xFF) + ((p1 & 0x7) << 3); + tp->tm_hour = (p1 >> 3) & 0xFF; + tp->tm_mday = (p2 & 0x1F); + tp->tm_mon = ((p2 >> 5) & 0xFF) + ((p3 & 0x1) << 3) - 1; + tp->tm_year = ((p3 >> 1) & 0xFF) + 80; } -/******************************************************************* - create a unix date from a dos date -********************************************************************/ -static time_t make_unix_date(const void *date_ptr) +/* + * create a unix date from a dos date + */ +static time_t +make_unix_date(const void *date_ptr) { - uint32 dos_date=0; - struct tm t; + uint32 dos_date = 0; + struct tm t; - dos_date = IVAL(date_ptr,0); + dos_date = IVAL(date_ptr, 0); - if (dos_date == 0) return(0); + if (dos_date == 0) + return(0); - interpret_dos_date(dos_date,&t.tm_year,&t.tm_mon, - &t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec); - t.tm_wday = 1; - t.tm_yday = 1; - t.tm_isdst = 0; + interpret_dos_date(dos_date, &t); + t.tm_wday = 1; + t.tm_yday = 1; + t.tm_isdst = 0; - return (mktime(&t)); + return (mktime(&t)); } -/******************************************************************* - create a unix date from a dos date -********************************************************************/ -static time_t make_unix_date2(const void *date_ptr) +/* + * create a unix date from a dos date + */ +static time_t +make_unix_date2(const void *date_ptr) { - uint32 x,x2; + uint32 x, x2; - x = IVAL(date_ptr,0); - x2 = ((x&0xFFFF)<<16) | ((x&0xFFFF0000)>>16); - SIVAL(&x,0,x2); + x = IVAL(date_ptr, 0); + x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); + SIVAL(&x, 0, x2); - return(make_unix_date((void *)&x)); + return(make_unix_date((void *)&x)); } -/**************************************************************************** -interpret an 8 byte "filetime" structure to a time_t -It's originally in "100ns units since jan 1st 1601" -****************************************************************************/ -static time_t interpret_long_date(const char *p) +/* + * interpret an 8 byte "filetime" structure to a time_t + * It's originally in "100ns units since jan 1st 1601" + */ +static time_t +interpret_long_date(const char *p) { - double d; - time_t ret; + double d; + time_t ret; - /* this gives us seconds since jan 1st 1601 (approx) */ - d = (IVAL(p,4)*256.0 + CVAL(p,3)) * (1.0e-7 * (1<<24)); + /* this gives us seconds since jan 1st 1601 (approx) */ + d = (IVAL(p, 4) * 256.0 + CVAL(p, 3)) * (1.0e-7 * (1 << 24)); - /* now adjust by 369 years to make the secs since 1970 */ - d -= 369.0*365.25*24*60*60; + /* now adjust by 369 years to make the secs since 1970 */ + d -= 369.0 * 365.25 * 24 * 60 * 60; - /* and a fudge factor as we got it wrong by a few days */ - d += (3*24*60*60 + 6*60*60 + 2); + /* and a fudge factor as we got it wrong by a few days */ + d += (3 * 24 * 60 * 60 + 6 * 60 * 60 + 2); - if (d<0) - return(0); + if (d < 0) + return(0); - ret = (time_t)d; + ret = (time_t)d; - return(ret); + return(ret); } - -/**************************************************************************** -interpret the weird netbios "name". Return the name type, or -1 if -we run past the end of the buffer -****************************************************************************/ -static int name_interpret(const uchar *in,const uchar *maxbuf,char *out) +/* + * interpret the weird netbios "name". Return the name type, or -1 if + * we run past the end of the buffer + */ +static int +name_interpret(const uchar *in, const uchar *maxbuf, char *out) { - int ret; - int len; - - if (in >= maxbuf) - return(-1); /* name goes past the end of the buffer */ - TCHECK2(*in, 1); - len = (*in++) / 2; + int ret; + int len; - *out=0; + if (in >= maxbuf) + return(-1); /* name goes past the end of the buffer */ + TCHECK2(*in, 1); + len = (*in++) / 2; - if (len > 30 || len<1) return(0); + *out=0; - while (len--) - { - if (in + 1 >= maxbuf) - return(-1); /* name goes past the end of the buffer */ - TCHECK2(*in, 2); - if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') { - *out = 0; + if (len > 30 || len < 1) return(0); - } - *out = ((in[0]-'A')<<4) + (in[1]-'A'); - in += 2; - out++; + + while (len--) { + if (in + 1 >= maxbuf) + return(-1); /* name goes past the end of the buffer */ + TCHECK2(*in, 2); + if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') { + *out = 0; + return(0); + } + *out = ((in[0] - 'A') << 4) + (in[1] - 'A'); + in += 2; + out++; } - *out = 0; - ret = out[-1]; + *out = 0; + ret = out[-1]; - return(ret); + return(ret); trunc: - return(-1); + return(-1); } -/**************************************************************************** -find a pointer to a netbios name -****************************************************************************/ -static const uchar *name_ptr(const uchar *buf,int ofs,const uchar *maxbuf) +/* + * find a pointer to a netbios name + */ +static const uchar * +name_ptr(const uchar *buf, int ofs, const uchar *maxbuf) { - const uchar *p; - uchar c; + const uchar *p; + uchar c; - p = buf+ofs; - if (p >= maxbuf) - return(NULL); /* name goes past the end of the buffer */ - TCHECK2(*p, 1); - - c = *p; - - /* XXX - this should use the same code that the DNS dissector does */ - if ((c & 0xC0) == 0xC0) - { - uint16 l = RSVAL(buf, ofs) & 0x3FFF; - if (l == 0) - { - /* We have a pointer that points to itself. */ - return(NULL); - } - p = buf + l; - if (p >= maxbuf) + p = buf + ofs; + if (p >= maxbuf) return(NULL); /* name goes past the end of the buffer */ - TCHECK2(*p, 1); - return(buf + l); - } - else - return(buf+ofs); + TCHECK2(*p, 1); + + c = *p; + + /* XXX - this should use the same code that the DNS dissector does */ + if ((c & 0xC0) == 0xC0) { + uint16 l = RSVAL(buf, ofs) & 0x3FFF; + if (l == 0) { + /* We have a pointer that points to itself. */ + return(NULL); + } + p = buf + l; + if (p >= maxbuf) + return(NULL); /* name goes past the end of the buffer */ + TCHECK2(*p, 1); + return(buf + l); + } else + return(buf + ofs); trunc: - return(NULL); /* name goes past the end of the buffer */ + return(NULL); /* name goes past the end of the buffer */ } -/**************************************************************************** -extract a netbios name from a buf -****************************************************************************/ -static int name_extract(const uchar *buf,int ofs,const uchar *maxbuf,char *name) +/* + * extract a netbios name from a buf + */ +static int +name_extract(const uchar *buf, int ofs, const uchar *maxbuf, char *name) { - const uchar *p = name_ptr(buf,ofs,maxbuf); - if (p == NULL) - return(-1); /* error (probably name going past end of buffer) */ - name[0] = '\0'; - return(name_interpret(p,maxbuf,name)); + const uchar *p = name_ptr(buf, ofs, maxbuf); + if (p == NULL) + return(-1); /* error (probably name going past end of buffer) */ + name[0] = '\0'; + return(name_interpret(p, maxbuf, name)); } -/**************************************************************************** -return the total storage length of a mangled name -****************************************************************************/ -static int name_len(const unsigned char *s, const unsigned char *maxbuf) +/* + * return the total storage length of a mangled name + */ +static int +name_len(const unsigned char *s, const unsigned char *maxbuf) { - const unsigned char *s0 = s; - unsigned char c; + const unsigned char *s0 = s; + unsigned char c; - if (s >= maxbuf) - return(-1); /* name goes past the end of the buffer */ - TCHECK2(*s, 1); - c = *s; - if ((c & 0xC0) == 0xC0) - return(2); - while (*s) - { - if (s >= maxbuf) + if (s >= maxbuf) return(-1); /* name goes past the end of the buffer */ - TCHECK2(*s, 1); - s += (*s)+1; + TCHECK2(*s, 1); + c = *s; + if ((c & 0xC0) == 0xC0) + return(2); + while (*s) { + if (s >= maxbuf) + return(-1); /* name goes past the end of the buffer */ + TCHECK2(*s, 1); + s += (*s) + 1; } - return(PTR_DIFF(s,s0)+1); + return(PTR_DIFF(s, s0) + 1); trunc: - return(-1); /* name goes past the end of the buffer */ + return(-1); /* name goes past the end of the buffer */ } -static void print_asc(const unsigned char *buf,int len) +static void +print_asc(const unsigned char *buf, int len) { - int i; - for (i=0;i8) + printf(" "); + while (n--) + printf(" "); + + n = MIN(8, i % 16); + print_asc(&buf[i - (i % 16)], n); + printf(" "); + n = (i % 16) - n; + if (n > 0) + print_asc(&buf[i - n], n); + printf("\n"); } - } - if (i%16) { - int n; - - n = 16 - (i%16); - printf(" "); - if (n>8) printf(" "); - while (n--) printf(" "); - - n = MIN(8,i%16); - print_asc(&buf[i-(i%16)],n); printf(" "); - n = (i%16) - n; - if (n>0) print_asc(&buf[i-n],n); - printf("\n"); - } } -static void write_bits(unsigned int val,char *fmt) +static void +write_bits(unsigned int val, char *fmt) { - char *p = fmt; - int i=0; - - while ((p=strchr(fmt,'|'))) { - int l = PTR_DIFF(p,fmt); - if (l && (val & (1<