X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/f01a14ae44e67d54f6bb89f034ed1b39a5c3f565..b58cddb15484ab7abbdd8d12e38a8ab768923f29:/smbutil.c diff --git a/smbutil.c b/smbutil.c index 92ae88ec..8d2d4170 100644 --- a/smbutil.c +++ b/smbutil.c @@ -12,7 +12,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.16 2001-06-25 21:04:01 itojun Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.21 2002-04-26 05:12:40 guy Exp $"; #endif #include @@ -26,20 +26,23 @@ static const char rcsid[] = #include #include #include +#ifdef TIME_WITH_SYS_TIME #include +#endif #include "interface.h" +#include "extract.h" #include "smb.h" -extern const uchar *startbuf; +extern const u_char *startbuf; /* * interpret a 32 bit dos packed date/time to some parameters */ static void -interpret_dos_date(uint32 date, struct tm *tp) +interpret_dos_date(u_int32_t date, struct tm *tp) { - uint32 p0, p1, p2, p3; + u_int32_t p0, p1, p2, p3; p0 = date & 0xFF; p1 = ((date & 0xFF00) >> 8) & 0xFF; @@ -55,16 +58,14 @@ interpret_dos_date(uint32 date, struct tm *tp) } /* + * common portion: * create a unix date from a dos date */ static time_t -make_unix_date(const void *date_ptr) +int_unix_date(u_int32_t dos_date) { - uint32 dos_date = 0; struct tm t; - dos_date = IVAL(date_ptr, 0); - if (dos_date == 0) return(0); @@ -78,17 +79,30 @@ make_unix_date(const void *date_ptr) /* * create a unix date from a dos date + * in network byte order */ static time_t -make_unix_date2(const void *date_ptr) +make_unix_date(const u_char *date_ptr) { - uint32 x, x2; + u_int32_t dos_date = 0; - x = IVAL(date_ptr, 0); - x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); - SIVAL(&x, 0, x2); + dos_date = EXTRACT_LE_32BITS(date_ptr); - return(make_unix_date((void *)&x)); + return int_unix_date(dos_date); +} + +/* + * create a unix date from a dos date + * in halfword-swapped network byte order! + */ +static time_t +make_unix_date2(const u_char *date_ptr) +{ + u_int32_t x, x2; + + x = EXTRACT_LE_32BITS(date_ptr); + x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); + return int_unix_date(x2); } /* @@ -96,13 +110,15 @@ make_unix_date2(const void *date_ptr) * It's originally in "100ns units since jan 1st 1601" */ static time_t -interpret_long_date(const char *p) +interpret_long_date(const u_char *p) { double d; time_t ret; + TCHECK2(p[4], 4); + /* this gives us seconds since jan 1st 1601 (approx) */ - d = (IVAL(p, 4) * 256.0 + CVAL(p, 3)) * (1.0e-7 * (1 << 24)); + d = (EXTRACT_LE_32BITS(p + 4) * 256.0 + 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; @@ -116,6 +132,8 @@ interpret_long_date(const char *p) ret = (time_t)d; return(ret); +trunc: + return(0); } /* @@ -123,7 +141,7 @@ interpret_long_date(const char *p) * we run past the end of the buffer */ static int -name_interpret(const uchar *in, const uchar *maxbuf, char *out) +name_interpret(const u_char *in, const u_char *maxbuf, char *out) { int ret; int len; @@ -139,9 +157,9 @@ name_interpret(const uchar *in, const uchar *maxbuf, char *out) return(0); while (len--) { + TCHECK2(*in, 2); 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); @@ -162,11 +180,11 @@ trunc: /* * find a pointer to a netbios name */ -static const uchar * -name_ptr(const uchar *buf, int ofs, const uchar *maxbuf) +static const u_char * +name_ptr(const u_char *buf, int ofs, const u_char *maxbuf) { - const uchar *p; - uchar c; + const u_char *p; + u_char c; p = buf + ofs; if (p >= maxbuf) @@ -177,7 +195,7 @@ name_ptr(const uchar *buf, int ofs, const uchar *maxbuf) /* XXX - this should use the same code that the DNS dissector does */ if ((c & 0xC0) == 0xC0) { - uint16 l = RSVAL(buf, ofs) & 0x3FFF; + u_int16_t l = EXTRACT_16BITS(buf + ofs) & 0x3FFF; if (l == 0) { /* We have a pointer that points to itself. */ return(NULL); @@ -198,9 +216,9 @@ trunc: * extract a netbios name from a buf */ static int -name_extract(const uchar *buf, int ofs, const uchar *maxbuf, char *name) +name_extract(const u_char *buf, int ofs, const u_char *maxbuf, char *name) { - const uchar *p = name_ptr(buf, ofs, maxbuf); + const u_char *p = name_ptr(buf, ofs, maxbuf); if (p == NULL) return(-1); /* error (probably name going past end of buffer) */ name[0] = '\0'; @@ -292,7 +310,7 @@ print_data(const unsigned char *buf, int len) while (n--) printf(" "); - n = MIN(8, i % 16); + n = SMBMIN(8, i % 16); print_asc(&buf[i - (i % 16)], n); printf(" "); n = (i % 16) - n; @@ -320,7 +338,7 @@ write_bits(unsigned int val, char *fmt) /* convert a UCS2 string into iso-8859-1 string */ static const char * -unistr(const char *s, int *len) +unistr(const u_char *s, int *len) { static char buf[1000]; int l=0; @@ -336,8 +354,8 @@ unistr(const char *s, int *len) /* maybe it isn't unicode - a cheap trick */ if (!use_unicode || (s[0] && s[1])) { - *len = strlen(s) + 1; - return s; + *len = strlen((const char *)s) + 1; + return (const char *)s; } *len = 0; @@ -358,8 +376,8 @@ unistr(const char *s, int *len) return buf; } -static const uchar * -fdata1(const uchar *buf, const char *fmt, const uchar *maxbuf) +static const u_char * +smb_fdata1(const u_char *buf, const char *fmt, const u_char *maxbuf) { int reverse = 0; char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|"; @@ -368,13 +386,13 @@ fdata1(const uchar *buf, const char *fmt, const uchar *maxbuf) while (*fmt && buf