sync 3.0 into HEAD for the last time
[tprouty/samba.git] / source / lib / util.c
index e58f5274df5069a93b8621e916c14c94868e1d1f..766c5041b4e13ff241fa9c3cbc85aa996de9e7d3 100644 (file)
@@ -4,7 +4,7 @@
    Copyright (C) Andrew Tridgell 1992-1998
    Copyright (C) Jeremy Allison 2001-2002
    Copyright (C) Simo Sorce 2001
-   Copyright (C) Anthony Liguori 2003
+   Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -99,7 +99,7 @@ BOOL set_global_myname(const char *myname)
        smb_myname = strdup(myname);
        if (!smb_myname)
                return False;
-       strupper(smb_myname);
+       strupper_m(smb_myname);
        return True;
 }
 
@@ -118,7 +118,7 @@ BOOL set_global_myworkgroup(const char *myworkgroup)
        smb_myworkgroup = strdup(myworkgroup);
        if (!smb_myworkgroup)
                return False;
-       strupper(smb_myworkgroup);
+       strupper_m(smb_myworkgroup);
        return True;
 }
 
@@ -137,7 +137,7 @@ BOOL set_global_scope(const char *scope)
        smb_scope = strdup(scope);
        if (!smb_scope)
                return False;
-       strupper(smb_scope);
+       strupper_m(smb_scope);
        return True;
 }
 
@@ -184,7 +184,7 @@ static BOOL set_my_netbios_names(const char *name, int i)
        smb_my_netbios_names[i] = strdup(name);
        if (!smb_my_netbios_names[i])
                return False;
-       strupper(smb_my_netbios_names[i]);
+       strupper_m(smb_my_netbios_names[i]);
        return True;
 }
 
@@ -261,11 +261,11 @@ BOOL init_names(void)
        }                       
 
        fstrcpy( local_machine, global_myname() );
-       trim_string( local_machine, " ", " " );
+       trim_char( local_machine, ' ', ' ' );
        p = strchr( local_machine, ' ' );
        if (p)
                *p = 0;
-       strlower( local_machine );
+       strlower_m( local_machine );
 
        DEBUG( 5, ("Netbios name list:-\n") );
        for( n=0; my_netbios_names(n); n++ )
@@ -311,7 +311,7 @@ BOOL in_group(gid_t group, gid_t current_gid, int ngroups, const gid_t *groups)
 
 static const char *Atoic(const char *p, int *n, const char *c)
 {
-       if (!isdigit((const int)*p)) {
+       if (!isdigit((int)*p)) {
                DEBUG(5, ("Atoic: malformed number\n"));
                return NULL;
        }
@@ -605,68 +605,6 @@ void unix_clean_name(char *s)
        trim_string(s,NULL,"/..");
 }
 
-/*******************************************************************
- Convert '\' to '/'.
- Reduce a file name, removing or reducing /../ , /./ , // elements.
- Remove also any trailing . and /
- Return a new allocated string.
-********************************************************************/
-
-smb_ucs2_t *unix_clean_path(const smb_ucs2_t *s)
-{
-       smb_ucs2_t *ns;
-       smb_ucs2_t *p, *r, *t;
-
-       DEBUG(3, ("unix_clean_path\n")); /*  [%unicode]\n")); */
-       if(!s)
-               return NULL;
-
-       /* convert '\' to '/' */
-       ns = strdup_w(s);
-       if (!ns)
-               return NULL;
-       unix_format_w(ns);
-
-       /* remove all double slashes */
-       p = ns;
-       ns = all_string_sub_wa(p, "//", "/");
-       SAFE_FREE(p);
-       if (!ns)
-               return NULL;
-
-       /* remove any /./ */
-       p = ns;
-       ns = all_string_sub_wa(p, "/./", "/");
-       SAFE_FREE(p);
-       if (!ns)
-               return NULL;
-
-       /* reduce any /../ */
-       t = ns;
-       while (*t && (r = strstr_wa(t, "/.."))) {
-               t = &(r[3]);
-               if (*t == UCS2_CHAR('/') || *t == 0) {
-                       *r = 0;
-                       p = strrchr_w(ns, UCS2_CHAR('/'));
-                       if (!p)
-                               p = ns;
-                       if (*t == 0)
-                               *p = 0;
-                       else
-                               memmove(p, t, (strlen_w(t) + 1) * sizeof(smb_ucs2_t));
-                       t = p;
-               }
-       }
-
-       /* remove any leading ./ trailing /. */
-       trim_string_wa(ns, "./", "/.");
-
-       /* remove any leading and trailing / */
-       trim_string_wa(ns, "/", "/");
-
-       return ns;
-}
-
 /****************************************************************************
  Make a dir struct.
 ****************************************************************************/
@@ -937,6 +875,19 @@ void *Realloc(void *p,size_t size)
        return(ret);
 }
 
+void *Realloc_zero(void *ptr, size_t size)
+{
+       void *tptr = NULL;
+               
+       tptr = Realloc(ptr, size);
+       if(tptr == NULL)
+               return NULL;
+
+       memset((char *)tptr,'\0',size);
+
+       return tptr;
+}
+
 /****************************************************************************
  Free memory, checks for NULL.
  Use directly SAFE_FREE()
@@ -1367,7 +1318,7 @@ char *gidtoname(gid_t gid)
  Convert a user name into a uid. 
 ********************************************************************/
 
-uid_t nametouid(char *name)
+uid_t nametouid(const char *name)
 {
        struct passwd *pass;
        char *p;
@@ -1415,7 +1366,6 @@ void smb_panic(const char *why)
 {
        char *cmd;
        int result;
-       size_t i;
 #ifdef HAVE_BACKTRACE_SYMBOLS
        void *backtrace_stack[BACKTRACE_STACK_SIZE];
        size_t backtrace_size;
@@ -1457,6 +1407,8 @@ void smb_panic(const char *why)
        DEBUG(0, ("BACKTRACE: %d stack frames:\n", backtrace_size));
        
        if (backtrace_strings) {
+               int i;
+
                for (i = 0; i < backtrace_size; i++)
                        DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
 
@@ -1897,6 +1849,17 @@ void dump_data(int level, const char *buf1,int len)
        }       
 }
 
+void dump_data_pw(const char *msg, const uchar * data, size_t len)
+{
+#ifdef DEBUG_PASSWORD
+       DEBUG(11, ("%s", msg));
+       if (data != NULL && len > 0)
+       {
+               dump_data(11, data, len);
+       }
+#endif
+}
+
 char *tab_depth(int depth)
 {
        static pstring spaces;
@@ -2180,7 +2143,7 @@ char *lock_path(const char *name)
        static pstring fname;
 
        pstrcpy(fname,lp_lockdir());
-       trim_string(fname,"","/");
+       trim_char(fname,'\0','/');
        
        if (!directory_exist(fname,NULL))
                mkdir(fname,0755);
@@ -2200,7 +2163,7 @@ char *pid_path(const char *name)
        static pstring fname;
 
        pstrcpy(fname,lp_piddir());
-       trim_string(fname,"","/");
+       trim_char(fname,'\0','/');
 
        if (!directory_exist(fname,NULL))
                mkdir(fname,0755);
@@ -2222,7 +2185,7 @@ char *pid_path(const char *name)
 char *lib_path(const char *name)
 {
        static pstring fname;
-       snprintf(fname, sizeof(fname), "%s/%s", dyn_LIBDIR, name);
+       fstr_sprintf(fname, "%s/%s", dyn_LIBDIR, name);
        return fname;
 }
 
@@ -2310,30 +2273,21 @@ BOOL ms_has_wild_w(const smb_ucs2_t *s)
 
 BOOL mask_match(const char *string, char *pattern, BOOL is_case_sensitive)
 {
-       fstring p2, s2;
-
        if (strcmp(string,"..") == 0)
                string = ".";
        if (strcmp(pattern,".") == 0)
                return False;
        
-       if (is_case_sensitive)
-               return ms_fnmatch(pattern, string, Protocol) == 0;
-
-       fstrcpy(p2, pattern);
-       fstrcpy(s2, string);
-       strlower(p2); 
-       strlower(s2);
-       return ms_fnmatch(p2, s2, Protocol) == 0;
+       return ms_fnmatch(pattern, string, Protocol, is_case_sensitive) == 0;
 }
 
 /*********************************************************
  Recursive routine that is called by unix_wild_match.
 *********************************************************/
 
-static BOOL unix_do_match(char *regexp, char *str)
+static BOOL unix_do_match(const char *regexp, const char *str)
 {
-       char *p;
+       const char *p;
 
        for( p = regexp; *p && *str; ) {
 
@@ -2439,8 +2393,8 @@ BOOL unix_wild_match(const char *pattern, const char *string)
 
        pstrcpy(p2, pattern);
        pstrcpy(s2, string);
-       strlower(p2);
-       strlower(s2);
+       strlower_m(p2);
+       strlower_m(s2);
 
        /* Remove any *? and ** from the pattern as they are meaningless */
        for(p = p2; *p; p++)
@@ -2453,6 +2407,7 @@ BOOL unix_wild_match(const char *pattern, const char *string)
        return unix_do_match(p2, s2) == 0;      
 }
 
+
 #ifdef __INSURE__
 
 /*******************************************************************