]> granicus.if.org Git - shadow/commitdiff
* po/POTFILES.in, libmisc/Makefile.am, lib/prototypes.h,
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Tue, 30 Mar 2010 21:54:29 +0000 (21:54 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Tue, 30 Mar 2010 21:54:29 +0000 (21:54 +0000)
libmisc/remove_tree.c, libmisc/copydir.c: Split remove_tree()
outside of copydir.c to avoid linking against libacl or libattr.

ChangeLog
lib/prototypes.h
libmisc/Makefile.am
libmisc/copydir.c
libmisc/remove_tree.c [new file with mode: 0644]
po/POTFILES.in

index 872f24d3ea81b1dc69d1443a648dcaa878b18e7f..4498e93d2704d6dee6a18a4ff9b5c2f895249f7e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-03-30  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * po/POTFILES.in, libmisc/Makefile.am, lib/prototypes.h,
+       libmisc/remove_tree.c, libmisc/copydir.c: Split remove_tree()
+       outside of copydir.c to avoid linking against libacl or libattr.
+
 2010-03-30  Nicolas François  <nicolas.francois@centraliens.net>
 
        * src/su.c: shell's name must be -su when a su fakes a login.
index a4f524217adc9f341e0d3889058b4e606d3e39c0..b9bbd0b2d2993919c0df13684fee9706b55316ed 100644 (file)
@@ -117,7 +117,6 @@ extern bool console (const char *);
 /* copydir.c */
 extern int copy_tree (const char *src_root, const char *dst_root,
                       long int uid, long int gid);
-extern int remove_tree (const char *root, bool remove_root);
 
 #ifdef WITH_SELINUX
 extern int selinux_file_context (const char *dst_name);
@@ -280,6 +279,9 @@ extern /*@dependent@*/ /*@null@*/struct commonio_entry *__pw_get_head (void);
 extern /*@null@*/ /*@only@*/struct passwd *__pw_dup (const struct passwd *pwent);
 extern void pw_free (/*@out@*/ /*@only@*/struct passwd *pwent);
 
+/* remove_tree.c */
+extern int remove_tree (const char *root, bool remove_root);
+
 /* rlogin.c */
 extern int do_rlogin (const char *remote_host, char *name, size_t namelen,
                       char *term, size_t termlen);
index dd5a08482da96efe26b2e9282296bba0aab5f440..fa254749cd15711d00e544a82af4dcf1a94aadf3 100644 (file)
@@ -44,6 +44,7 @@ libmisc_a_SOURCES = \
        pwd2spwd.c \
        pwdcheck.c \
        pwd_init.c \
+       remove_tree.c \
        rlogin.c \
        salt.c \
        setugid.c \
index c48e7c5d2bba027b70e2bbc713aee33df2c9dd5c..4509d17c658905e7df21b7d636c7f0b636bb2b6a 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 1991 - 1994, Julianne Frances Haugh
  * Copyright (c) 1996 - 2001, Marek Michałkiewicz
  * Copyright (c) 2003 - 2006, Tomasz Kłoczko
- * Copyright (c) 2007 - 2008, Nicolas François
+ * Copyright (c) 2007 - 2010, Nicolas François
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -740,92 +740,3 @@ static int copy_file (const char *src, const char *dst,
        return err;
 }
 
-/*
- * remove_tree - delete a directory tree
- *
- *     remove_tree() walks a directory tree and deletes all the files
- *     and directories.
- *     At the end, it deletes the root directory itself.
- */
-
-int remove_tree (const char *root, bool remove_root)
-{
-       char *new_name = NULL;
-       int err = 0;
-       struct DIRECT *ent;
-       struct stat sb;
-       DIR *dir;
-
-       /*
-        * Open the source directory and read each entry.  Every file
-        * entry in the directory is copied with the UID and GID set
-        * to the provided values.  As an added security feature only
-        * regular files (and directories ...) are copied, and no file
-        * is made set-ID.
-        */
-       dir = opendir (root);
-       if (NULL == dir) {
-               return -1;
-       }
-
-       while ((ent = readdir (dir))) {
-               size_t new_len = strlen (root) + strlen (ent->d_name) + 2;
-
-               /*
-                * Skip the "." and ".." entries
-                */
-
-               if (strcmp (ent->d_name, ".") == 0 ||
-                   strcmp (ent->d_name, "..") == 0) {
-                       continue;
-               }
-
-               /*
-                * Make the filename for the current entry.
-                */
-
-               if (NULL != new_name) {
-                       free (new_name);
-               }
-               new_name = (char *) malloc (new_len);
-               if (NULL == new_name) {
-                       err = -1;
-                       break;
-               }
-               snprintf (new_name, new_len, "%s/%s", root, ent->d_name);
-               if (LSTAT (new_name, &sb) == -1) {
-                       continue;
-               }
-
-               if (S_ISDIR (sb.st_mode)) {
-                       /*
-                        * Recursively delete this directory.
-                        */
-                       if (remove_tree (new_name, true) != 0) {
-                               err = -1;
-                               break;
-                       }
-               } else {
-                       /*
-                        * Delete the file.
-                        */
-                       if (unlink (new_name) != 0) {
-                               err = -1;
-                               break;
-                       }
-               }
-       }
-       if (NULL != new_name) {
-               free (new_name);
-       }
-       (void) closedir (dir);
-
-       if (remove_root && (0 == err)) {
-               if (rmdir (root) != 0) {
-                       err = -1;
-               }
-       }
-
-       return err;
-}
-
diff --git a/libmisc/remove_tree.c b/libmisc/remove_tree.c
new file mode 100644 (file)
index 0000000..ec513a4
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 1991 - 1994, Julianne Frances Haugh
+ * Copyright (c) 1996 - 2001, Marek Michałkiewicz
+ * Copyright (c) 2003 - 2006, Tomasz Kłoczko
+ * Copyright (c) 2007 - 2010, Nicolas François
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the copyright holders or contributors may not be used to
+ *    endorse or promote products derived from this software without
+ *    specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#ident "$Id$"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <unistd.h>
+#include "prototypes.h"
+#include "defines.h"
+
+/*
+ * remove_tree - delete a directory tree
+ *
+ *     remove_tree() walks a directory tree and deletes all the files
+ *     and directories.
+ *     At the end, it deletes the root directory itself.
+ */
+
+int remove_tree (const char *root, bool remove_root)
+{
+       char *new_name = NULL;
+       int err = 0;
+       struct DIRECT *ent;
+       struct stat sb;
+       DIR *dir;
+
+       /*
+        * Open the source directory and read each entry.  Every file
+        * entry in the directory is copied with the UID and GID set
+        * to the provided values.  As an added security feature only
+        * regular files (and directories ...) are copied, and no file
+        * is made set-ID.
+        */
+       dir = opendir (root);
+       if (NULL == dir) {
+               return -1;
+       }
+
+       while ((ent = readdir (dir))) {
+               size_t new_len = strlen (root) + strlen (ent->d_name) + 2;
+
+               /*
+                * Skip the "." and ".." entries
+                */
+
+               if (strcmp (ent->d_name, ".") == 0 ||
+                   strcmp (ent->d_name, "..") == 0) {
+                       continue;
+               }
+
+               /*
+                * Make the filename for the current entry.
+                */
+
+               if (NULL != new_name) {
+                       free (new_name);
+               }
+               new_name = (char *) malloc (new_len);
+               if (NULL == new_name) {
+                       err = -1;
+                       break;
+               }
+               snprintf (new_name, new_len, "%s/%s", root, ent->d_name);
+               if (LSTAT (new_name, &sb) == -1) {
+                       continue;
+               }
+
+               if (S_ISDIR (sb.st_mode)) {
+                       /*
+                        * Recursively delete this directory.
+                        */
+                       if (remove_tree (new_name, true) != 0) {
+                               err = -1;
+                               break;
+                       }
+               } else {
+                       /*
+                        * Delete the file.
+                        */
+                       if (unlink (new_name) != 0) {
+                               err = -1;
+                               break;
+                       }
+               }
+       }
+       if (NULL != new_name) {
+               free (new_name);
+       }
+       (void) closedir (dir);
+
+       if (remove_root && (0 == err)) {
+               if (rmdir (root) != 0) {
+                       err = -1;
+               }
+       }
+
+       return err;
+}
+
index 5045502b8cf55102f6dfbd70e55df4acd3ce8c0b..6cb3cdb578482d7eae9fa59411479f8f9ea4e181 100644 (file)
@@ -59,6 +59,7 @@ libmisc/pam_pass.c
 libmisc/pwd2spwd.c
 libmisc/pwdcheck.c
 libmisc/pwd_init.c
+libmisc/remove_tree.c
 libmisc/rlogin.c
 libmisc/salt.c
 libmisc/setugid.c