diff options
Diffstat (limited to 'src/diskio.c')
-rw-r--r-- | src/diskio.c | 68 |
1 files changed, 25 insertions, 43 deletions
diff --git a/src/diskio.c b/src/diskio.c index fbd1050..35ba71e 100644 --- a/src/diskio.c +++ b/src/diskio.c @@ -55,15 +55,15 @@ concat_dir (const char *base, const char *name, size_t *pbaselen) if (pbaselen) *pbaselen = len; return dir; } /* Create the directory DIR, eventually creating all intermediate directories - starting from DIR + BASELEN, with owner UID and GID. */ + starting from DIR + BASELEN. */ int -create_hierarchy (char *dir, size_t baselen, uid_t uid, gid_t gid) +create_hierarchy (char *dir, size_t baselen) { int rc; struct stat st; char *p; if (stat (dir, &st) == 0) @@ -89,60 +89,51 @@ create_hierarchy (char *dir, size_t baselen, uid_t uid, gid_t gid) logmsg (LOG_ERR, _("base directory %s does not exist"), dir); return 1; } *p = 0; } - rc = create_hierarchy (dir, baselen, uid, gid); + rc = create_hierarchy (dir, baselen); if (rc == 0) { if (p) *p = '/'; if (mkdir (dir, MKDIR_PERMISSIONS)) { logmsg (LOG_ERR, _("cannot create directory %s: %s"), dir, strerror (errno)); rc = 1; } - if (chown (dir, uid, gid)) - { - logmsg (LOG_NOTICE, _("cannot change ownership of %s: %s"), - dir, strerror (errno)); - } } return rc; } /* Create a directory BASE/NAME (with eventual intermediate directories in NAME). Use UID and GID as owner ids. Do nothing if dry_run_mode is set. */ char * -create_directory (const char *base, const char *name, uid_t uid, gid_t gid) +create_directory (const char *base, const char *name) { size_t baselen; char *dir = concat_dir (base, name, &baselen); if (!dry_run_mode) { - int rc; - wydawca_set_root_privs (); - rc = create_hierarchy (dir, baselen, uid, gid); - wydawca_set_privs (uid, gid); - if (rc) + if (create_hierarchy (dir, baselen)) { free (dir); dir = NULL; } } return dir; } -/* Copy FILE to DST_FILE, creating the latter with owner UID and GID. */ +/* Copy FILE to DST_FILE. */ int -copy_file (const char *file, const char *dst_file, uid_t uid, gid_t gid) +copy_file (const char *file, const char *dst_file) { int in_fd, out_fd; struct stat st; int rc; char *buf; size_t bufsize; @@ -220,24 +211,23 @@ copy_file (const char *file, const char *dst_file, uid_t uid, gid_t gid) if (rc) unlink (dst_file); return rc; } /* Move FILE to DST_FILE. If they reside on different devices, use copy_file - + unlink. - UID and GID give DST_FILE ownership. */ + + unlink. */ int -do_move_file (const char *file, const char *dst_file, uid_t uid, gid_t gid) +do_move_file (const char *file, const char *dst_file) { int rc = 0; if (rename (file, dst_file)) { if (errno == EXDEV) { - if (copy_file (file, dst_file, uid, gid)) + if (copy_file (file, dst_file)) { logmsg (LOG_CRIT, _("cannot copy %s to %s: %s"), file, dst_file, strerror (errno)); rc = 1; } else if (unlink (file)) @@ -296,29 +286,28 @@ tar_append_file (const char *archive, const char *file) /* Backup a file to a directory. Arguments: DST_FILE - File nam to back up. DST_DIR - Directory part of DST_FILE. FILE - File part of DST_FILE; can contain subdirs. ARCHIVE - Archive descriptor. - UID, GID - Ownership RELDIR - Directory part of FILE Do nothing if dry_run_mode is set. */ int backup_file (const char *dst_file, const char *dst_dir, const char *file, - const struct archive_descr *archive, uid_t uid, gid_t gid, + const struct archive_descr *archive, const char *reldir) { int rc = 0; char *adir; char *file_name; if (archive->name[0] == '/') - adir = create_directory (archive->name, reldir, uid, gid); + adir = create_directory (archive->name, reldir); else - adir = create_directory (dst_dir, archive->name, uid, gid); + adir = create_directory (dst_dir, archive->name); if (!adir) return 1; file_name = concat_dir (adir, file, NULL); if (access (file_name, F_OK) == 0) { @@ -344,13 +333,13 @@ backup_file (const char *dst_file, const char *dst_dir, const char *file, if (debug_level) logmsg (LOG_DEBUG, _("backing up previous archive file `%s' to `%s'"), file_name, archive_file_name); if (!dry_run_mode) { - rc = do_move_file (file_name, archive_file_name, uid, gid); + rc = do_move_file (file_name, archive_file_name); if (rc) { logmsg (LOG_ERR, _("backing `%s' up as `%s' failed: %s"), file_name, archive_file_name, strerror (errno)); free (archive_file_name); free (file_name); @@ -363,13 +352,13 @@ backup_file (const char *dst_file, const char *dst_dir, const char *file, } if (debug_level) logmsg (LOG_DEBUG, _("archiving `%s' to `%s'"), dst_file, file_name); if (!dry_run_mode) { - rc = do_move_file (dst_file, file_name, uid, gid); + rc = do_move_file (dst_file, file_name); if (rc) logmsg (LOG_ERR, _("archiving `%s' as `%s' failed: %s"), dst_file, file_name, strerror (errno)); } free (file_name); free (adir); @@ -377,22 +366,22 @@ backup_file (const char *dst_file, const char *dst_dir, const char *file, } /* Select the appropriate backup type and backup a file. See backup_file for the argument description. */ int do_archive_file (const char *dst_file, const char *dst_dir, const char *file, - const struct archive_descr *archive, uid_t uid, gid_t gid, + const struct archive_descr *archive, const char *reldir) { switch (archive->type) { case archive_none: break; case archive_directory: - return backup_file (dst_file, dst_dir, file, archive, uid, gid, reldir); + return backup_file (dst_file, dst_dir, file, archive, reldir); case archive_tar: if (tar_append_file (archive->name, dst_file)) return 1; } if (!dry_run_mode && unlink (dst_file)) @@ -412,31 +401,28 @@ do_archive_file (const char *dst_file, const char *dst_dir, const char *file, int dir_move_file (struct file_triplet *trp, const struct spool *spool, enum file_type file_id, const char *reldir) { char *dst_file; int rc = 0; - char *dst_dir = create_directory (spool->dest_dir, reldir, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + char *dst_dir = create_directory (spool->dest_dir, reldir); if (!dst_dir) return 1; dst_file = concat_dir (dst_dir, trp->file[file_id].name, NULL); if (debug_level) logmsg (LOG_DEBUG, _("installing %s to %s"), trp->file[file_id].name, dst_dir); if (access (dst_file, F_OK) == 0) rc = do_archive_file (dst_file, dst_dir, trp->file[file_id].name, - &spool->archive, - TRIPLET_UID (trp), TRIPLET_GID (trp), reldir); + &spool->archive, reldir); if (!dry_run_mode && rc == 0) - rc = do_move_file (trp->file[file_id].name, dst_file, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + rc = do_move_file (trp->file[file_id].name, dst_file); free (dst_file); free (dst_dir); if (rc == 0) UPDATE_STATS (STAT_UPLOADS); return rc; @@ -450,14 +436,13 @@ int archive_single_file (struct file_triplet *trp, const struct spool *spool, const char *file_name, const char *reldir, int noentok) { char *dst_file; int rc = 0; - char *dst_dir = create_directory (spool->dest_dir, reldir, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + char *dst_dir = create_directory (spool->dest_dir, reldir); if (!dst_dir) return 1; dst_file = safe_file_name (concat_dir (dst_dir, file_name, NULL)); if (!sub_dir_p (dst_file, spool->dest_dir)) @@ -471,13 +456,13 @@ archive_single_file (struct file_triplet *trp, const struct spool *spool, if (access (dst_file, F_OK) == 0) { if (debug_level) logmsg (LOG_DEBUG, _("archiving file `%s'"), dst_file); rc = do_archive_file (dst_file, dst_dir, file_name, &spool->archive, - TRIPLET_UID (trp), TRIPLET_GID (trp), reldir); + reldir); if (rc == 0) UPDATE_STATS (STAT_ARCHIVES); } else if (errno == ENOENT) { if (!noentok) @@ -540,14 +525,13 @@ int dir_symlink_file (struct file_triplet *trp, const struct spool *spool, const char *reldir, const char *wanted_src, const char *wanted_dst) { int rc = 0; struct saved_cwd cwd; - char *dst_dir = create_directory (spool->dest_dir, reldir, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + char *dst_dir = create_directory (spool->dest_dir, reldir); char *src, *dst; if (!dst_dir) return 1; if (save_cwd (&cwd)) @@ -585,14 +569,13 @@ dir_symlink_file (struct file_triplet *trp, const struct spool *spool, char *p = strrchr (dst, '/'); if (p > dst) { char *dir; *p = 0; - dir = create_directory (spool->dest_dir, dst, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + dir = create_directory (spool->dest_dir, dst); if (!dir) rc = 1; else free (dir); *p = '/'; } @@ -700,14 +683,13 @@ int dir_rmsymlink_file (struct file_triplet *trp, const struct spool *spool, const char *reldir, const char *file_name) { char *dst_file; int rc = 0; char *signame; - char *dst_dir = create_directory (spool->dest_dir, reldir, - TRIPLET_UID (trp), TRIPLET_GID (trp)); + char *dst_dir = create_directory (spool->dest_dir, reldir); if (!dst_dir) return 1; dst_file = safe_file_name (concat_dir (dst_dir, file_name, NULL)); if (!sub_dir_p (dst_file, spool->dest_dir)) |