Fix now erroneous comment for directory_create_or_exist()
[samba.git] / lib / util / util.c
index 7c669fbd5eac7457f2cb197f27fed7c0bbce0c2d..ec70c342f37e5cbbcf3a60ec2c4f574afb46bc81 100644 (file)
@@ -121,6 +121,50 @@ _PUBLIC_ time_t file_modtime(const char *fname)
        return(st.st_mtime);
 }
 
+/**
+ Check file permissions.
+**/
+
+_PUBLIC_ bool file_check_permissions(const char *fname,
+                                    uid_t uid,
+                                    mode_t file_perms,
+                                    struct stat *pst)
+{
+       int ret;
+       struct stat st;
+
+       if (pst == NULL) {
+               pst = &st;
+       }
+
+       ZERO_STRUCTP(pst);
+
+       ret = stat(fname, pst);
+       if (ret != 0) {
+               DEBUG(0, ("stat failed on file '%s': %s\n",
+                        fname, strerror(errno)));
+               return false;
+       }
+
+       if (pst->st_uid != uid && !uid_wrapper_enabled()) {
+               DEBUG(0, ("invalid ownership of file '%s': "
+                        "owned by uid %u, should be %u\n",
+                        fname, (unsigned int)pst->st_uid,
+                        (unsigned int)uid));
+               return false;
+       }
+
+       if ((pst->st_mode & 0777) != file_perms) {
+               DEBUG(0, ("invalid permissions on file "
+                        "'%s': has 0%o should be 0%o\n", fname,
+                        (unsigned int)(pst->st_mode & 0777),
+                        (unsigned int)file_perms));
+               return false;
+       }
+
+       return true;
+}
+
 /**
  Check if a directory exists.
 **/
@@ -143,44 +187,44 @@ _PUBLIC_ bool directory_exist(const char *dname)
 /**
  * Try to create the specified directory if it didn't exist.
  *
- * @retval true if the directory already existed and has the right permissions 
+ * @retval true if the directory already existed
  * or was successfully created.
  */
 _PUBLIC_ bool directory_create_or_exist(const char *dname,
-                                       uid_t uid,
                                        mode_t dir_perms)
 {
        int ret;
        struct stat st;
+       mode_t old_umask;
 
        ret = lstat(dname, &st);
-       if (ret == -1) {
-               mode_t old_umask;
+       if (ret == 0) {
+               return true;
+       }
 
-               if (errno != ENOENT) {
-                       DEBUG(0, ("lstat failed on directory %s: %s\n",
-                                 dname, strerror(errno)));
-                       return false;
-               }
+       if (errno != ENOENT) {
+               DEBUG(0, ("lstat failed on directory %s: %s\n",
+                         dname, strerror(errno)));
+               return false;
+       }
 
-               /* Create directory */
-               old_umask = umask(0);
-               ret = mkdir(dname, dir_perms);
-               if (ret == -1 && errno != EEXIST) {
-                       DEBUG(0, ("mkdir failed on directory "
-                                 "%s: %s\n", dname,
-                                 strerror(errno)));
-                       umask(old_umask);
-                       return false;
-               }
+       /* Create directory */
+       old_umask = umask(0);
+       ret = mkdir(dname, dir_perms);
+       if (ret == -1 && errno != EEXIST) {
+               DEBUG(0, ("mkdir failed on directory "
+                         "%s: %s\n", dname,
+                         strerror(errno)));
                umask(old_umask);
+               return false;
+       }
+       umask(old_umask);
 
-               ret = lstat(dname, &st);
-               if (ret == -1) {
-                       DEBUG(0, ("lstat failed on created directory %s: %s\n",
-                                 dname, strerror(errno)));
-                       return false;
-               }
+       ret = lstat(dname, &st);
+       if (ret == -1) {
+               DEBUG(0, ("lstat failed on created directory %s: %s\n",
+                         dname, strerror(errno)));
+               return false;
        }
 
        return true;
@@ -190,7 +234,7 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname,
  * @brief Try to create a specified directory if it doesn't exist.
  *
  * The function creates a directory with the given uid and permissions if it
- * doesn't exixt. If it exists it makes sure the uid and permissions are
+ * doesn't exist. If it exists it makes sure the uid and permissions are
  * correct and it will fail if they are different.
  *
  * @param[in]  dname  The directory to create.
@@ -209,7 +253,7 @@ _PUBLIC_ bool directory_create_or_exist_strict(const char *dname,
        bool ok;
        int rc;
 
-       ok = directory_create_or_exist(dname, uid, dir_perms);
+       ok = directory_create_or_exist(dname, dir_perms);
        if (!ok) {
                return false;
        }
@@ -227,7 +271,7 @@ _PUBLIC_ bool directory_create_or_exist_strict(const char *dname,
                        dname));
                return false;
        }
-       if (st.st_uid != uid && !uwrap_enabled()) {
+       if (st.st_uid != uid && !uid_wrapper_enabled()) {
                DEBUG(0, ("invalid ownership on directory "
                          "%s\n", dname));
                return false;
@@ -526,7 +570,6 @@ _PUBLIC_ void dump_data_dbgc(int dbgc_class, int level, const uint8_t *buf, int
        struct debug_channel_level dcl = { dbgc_class, level };
 
        if (!DEBUGLVLC(dbgc_class, level)) {
-               DEBUG(0, ("dbgc_class is %d\n", dbgc_class));
                return;
        }
        dump_data_cb(buf, len, false, debugadd_channel_cb, &dcl);
@@ -650,7 +693,7 @@ char *smb_xstrndup(const char *s, size_t n)
  Like strdup but for memory.
 **/
 
-_PUBLIC_ void *memdup(const void *p, size_t size)
+_PUBLIC_ void *smb_memdup(const void *p, size_t size)
 {
        void *p2;
        if (size == 0)