|
@@ -55,17 +55,20 @@ int mkdir_p(char *path, mode_t mode)
|
|
|
return (stat(path, &st) && mkdir(path, mode)) ? -1 : 0;
|
|
|
}
|
|
|
|
|
|
-static int slow_copyfile(const char *from, const char *to)
|
|
|
+static int slow_copyfile(const char *from, const char *to, mode_t mode)
|
|
|
{
|
|
|
- int err = 0;
|
|
|
+ int err = -1;
|
|
|
char *line = NULL;
|
|
|
size_t n;
|
|
|
FILE *from_fp = fopen(from, "r"), *to_fp;
|
|
|
+ mode_t old_umask;
|
|
|
|
|
|
if (from_fp == NULL)
|
|
|
goto out;
|
|
|
|
|
|
+ old_umask = umask(mode ^ 0777);
|
|
|
to_fp = fopen(to, "w");
|
|
|
+ umask(old_umask);
|
|
|
if (to_fp == NULL)
|
|
|
goto out_fclose_from;
|
|
|
|
|
@@ -82,7 +85,7 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-int copyfile(const char *from, const char *to)
|
|
|
+int copyfile_mode(const char *from, const char *to, mode_t mode)
|
|
|
{
|
|
|
int fromfd, tofd;
|
|
|
struct stat st;
|
|
@@ -93,13 +96,13 @@ int copyfile(const char *from, const char *to)
|
|
|
goto out;
|
|
|
|
|
|
if (st.st_size == 0) /* /proc? do it slowly... */
|
|
|
- return slow_copyfile(from, to);
|
|
|
+ return slow_copyfile(from, to, mode);
|
|
|
|
|
|
fromfd = open(from, O_RDONLY);
|
|
|
if (fromfd < 0)
|
|
|
goto out;
|
|
|
|
|
|
- tofd = creat(to, 0755);
|
|
|
+ tofd = creat(to, mode);
|
|
|
if (tofd < 0)
|
|
|
goto out_close_from;
|
|
|
|
|
@@ -121,6 +124,11 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+int copyfile(const char *from, const char *to)
|
|
|
+{
|
|
|
+ return copyfile_mode(from, to, 0755);
|
|
|
+}
|
|
|
+
|
|
|
unsigned long convert_unit(unsigned long value, char *unit)
|
|
|
{
|
|
|
*unit = ' ';
|