diff options
author | Christopher R. Hertel <crh@samba.org> | 1997-10-07 22:04:05 +0000 |
---|---|---|
committer | Christopher R. Hertel <crh@samba.org> | 1997-10-07 22:04:05 +0000 |
commit | ed61181f29bcbc3ae483bba1bb039f4be08aeaea (patch) | |
tree | a403cf1a541073371edda57050e34a5f590b792a /source3/lib/util.c | |
parent | fb27bc139f8d321e50471c595b65b277ee114801 (diff) | |
download | samba-ed61181f29bcbc3ae483bba1bb039f4be08aeaea.tar.gz samba-ed61181f29bcbc3ae483bba1bb039f4be08aeaea.tar.bz2 samba-ed61181f29bcbc3ae483bba1bb039f4be08aeaea.zip |
I rewrote the name_mangle() and name_len().
The interface is the same, but I've simplified the code a bit and added
a few comments. I tested the changes and the output is the same as that
produced by the original (at least, it was in all of my tests). CRH
(This used to be commit 707d0ec388c0045938f367e1d17919bfc8637fea)
Diffstat (limited to 'source3/lib/util.c')
-rw-r--r-- | source3/lib/util.c | 111 |
1 files changed, 65 insertions, 46 deletions
diff --git a/source3/lib/util.c b/source3/lib/util.c index 611794c4a8..39d3c61b9e 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -684,48 +684,61 @@ static int name_interpret(char *in,char *out) /**************************************************************************** mangle a name into netbios format + + Note: <Out> must be (33 + strlen(scope) + 2) bytes long, at minimum. ****************************************************************************/ -int name_mangle(char *In,char *Out,char name_type) -{ - fstring name; - char buf[20]; - char *in = (char *)&buf[0]; - char *out = (char *)Out; - char *p, *label; - int i; +int name_mangle( char *In, char *Out, char name_type ) + { + int i; + int c; + int len; + char buf[20]; + char *p = Out; + + /* Safely copy the input string, In, into buf[]. */ + (void)memset( buf, 0, 20 ); + if( '*' == In[0] ) + buf[0] = '*'; + else + (void)sprintf( buf, "%-15.15s%c", In, name_type ); - if (In[0] != '*') { - StrnCpy(name,In,sizeof(name)-1); - sprintf(buf,"%-15.15s%c",name,name_type); - } else { - buf[0]='*'; - memset(&buf[1],0,16); - } + /* Place the length of the first field into the output buffer. */ + p[0] = 32; + p++; - *out++ = 32; - for (i=0;i<16;i++) { - char c = toupper(in[i]); - out[i*2] = (c>>4) + 'A'; - out[i*2+1] = (c & 0xF) + 'A'; - } - out[32]=0; - out += 32; - - label = scope; - while (*label) + /* Now convert the name to the rfc1001/1002 format. */ + for( i = 0; i < 16; i++ ) { - p = strchr(label, '.'); - if (p == 0) - p = label + strlen(label); - *out++ = p - label; - memcpy(out, label, p - label); - out += p - label; - label += p - label + (*p == '.'); + c = toupper( buf[i] ); + p[i*2] = ( (c >> 4) & 0x000F ) + 'A'; + p[(i*2)+1] = (c & 0x000F) + 'A'; } - *out = 0; - return(name_len(Out)); -} + p += 32; + p[0] = '\0'; + /* Add the scope string. */ + for( i = 0, len = 0; NULL != scope; i++, len++ ) + { + switch( scope[i] ) + { + case '\0': + p[0] = len; + if( len > 0 ) + p[len+1] = 0; + return( name_len(Out) ); + case '.': + p[0] = len; + p += (len + 1); + len = 0; + break; + default: + p[len+1] = scope[i]; + break; + } + } + + return( name_len(Out) ); + } /* name_mangle */ /******************************************************************* check if a file exists @@ -2555,21 +2568,27 @@ int name_extract(char *buf,int ofs,char *name) strcpy(name,""); if (d < -50 || d > 50) return(0); return(name_interpret(p,name)); -} +} - /**************************************************************************** return the total storage length of a mangled name ****************************************************************************/ -int name_len(char *s) -{ - char *s0=s; - unsigned char c = *(unsigned char *)s; - if ((c & 0xC0) == 0xC0) +int name_len( char *s ) + { + int len; + + /* If the two high bits of the byte are set, return 2. */ + if( 0xC0 == (*(unsigned char *)s & 0xC0) ) return(2); - while (*s) s += (*s)+1; - return(PTR_DIFF(s,s0)+1); -} + + /* Add up the length bytes. */ + for( len = 1; (*s); s += (*s) + 1 ) + { + len += *s + 1; + } + + return( len ); + } /* name_len */ /**************************************************************************** send a single packet to a port on another machine |