/* Returns NULL on failure */ hash_t* SMBCALL smb_hashstr(ulong msgnum, uint32_t t, unsigned source, unsigned flags ,const char* str) { char* p=NULL; hash_t* hash; if(flags&SMB_HASH_PROC_MASK) { /* string pre-processing */ if((p=strdup(str))==NULL) return(NULL); if(flags&SMB_HASH_STRIP_CTRL_A) strip_ctrla((uchar *)p,(uchar *)p); if(flags&SMB_HASH_STRIP_WSP) strip_chars((uchar *)p,(uchar *)p,(uchar *)" \t\r\n"); if(flags&SMB_HASH_LOWERCASE) strlwr(p); } if(p!=NULL) { hash=smb_hash(msgnum, t, source, flags, p, strlen(p)); free(p); } else hash=smb_hash(msgnum, t, source, flags, str, strlen(str)); return(hash); }
/* length=0 specifies ASCIIZ data */ int SMBCALL smb_getmsgidx_by_hash(smb_t* smb, smbmsg_t* msg, unsigned source ,unsigned flags, const void* data, size_t length) { int retval; size_t n; hash_t** hashes; hash_t found; if((hashes=(hash_t**)malloc(sizeof(hash_t*)*2))==NULL) return(SMB_ERR_MEM); if(length==0) hashes[0]=smb_hashstr(0,0,source,flags,data); else hashes[0]=smb_hash(0,0,source,flags,data,length); if(hashes[0]==NULL) return(SMB_ERR_MEM); hashes[1]=NULL; /* terminate list */ if((retval=smb_findhash(smb, hashes, &found, 1<<source, FALSE))==SMB_SUCCESS) { if(found.number==0) retval=SMB_FAILURE; /* use better error value here? */ else { msg->hdr.number=found.number; retval=smb_getmsgidx(smb, msg); } } FREE_LIST(hashes,n); return(retval); }
/* Returns NULL on failure */ hash_t* SMBCALL smb_hashstr(ulong msgnum, ulong t, unsigned source, unsigned flags ,const char* str) { char* p=(char *)str; hash_t* hash; if(flags&SMB_HASH_PROC_MASK) { /* string pre-processing */ if((p=strdup(str))==NULL) return(NULL); if(flags&SMB_HASH_STRIP_WSP) strip_chars(p,str," \t\r\n"); if(flags&SMB_HASH_LOWERCASE) strlwr(p); } hash=smb_hash(msgnum, t, source, flags, p, strlen(p)); if(p!=str) /* duped string */ free(p); return(hash); }