t[1].tv_usec = 0;
# ifdef HAVE_LUTIMES
if (S_ISLNK(mode)) {
- lutimes(fname, t);
- return 0; /* ignore errors */
+ if (lutimes(fname, t) < 0)
+ return errno == ENOSYS ? 1 : -1;
+ return 0;
}
# endif
return utimes(fname, t);
-#elif defined HAVE_UTIMBUF
+#elif defined HAVE_STRUCT_UTIMBUF
struct utimbuf tbuf;
tbuf.actime = time(NULL);
tbuf.modtime = modtime;
int len; /* Number of bytes read into `buf'. */
if ((ifd = do_open(source, O_RDONLY, 0)) < 0) {
- rsyserr(FERROR, errno, "open %s", full_fname(source));
+ rsyserr(FERROR_XFER, errno, "open %s", full_fname(source));
return -1;
}
if (ofd < 0) {
if (robust_unlink(dest) && errno != ENOENT) {
- rsyserr(FERROR, errno, "unlink %s", full_fname(dest));
+ rsyserr(FERROR_XFER, errno, "unlink %s", full_fname(dest));
return -1;
}
if ((ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0
&& (!create_bak_dir || errno != ENOENT || make_bak_dir(dest) < 0
|| (ofd = do_open(dest, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, mode)) < 0)) {
- rsyserr(FERROR, errno, "open %s", full_fname(dest));
+ rsyserr(FERROR_XFER, errno, "open %s", full_fname(dest));
close(ifd);
return -1;
}
while ((len = safe_read(ifd, buf, sizeof buf)) > 0) {
if (full_write(ofd, buf, len) < 0) {
- rsyserr(FERROR, errno, "write %s", full_fname(dest));
+ rsyserr(FERROR_XFER, errno, "write %s", full_fname(dest));
close(ifd);
close(ofd);
return -1;
}
if (len < 0) {
- rsyserr(FERROR, errno, "read %s", full_fname(source));
+ rsyserr(FERROR_XFER, errno, "read %s", full_fname(source));
close(ifd);
close(ofd);
return -1;
}
if (close(ifd) < 0) {
- rsyserr(FINFO, errno, "close failed on %s",
+ rsyserr(FWARNING, errno, "close failed on %s",
full_fname(source));
}
if (close(ofd) < 0) {
- rsyserr(FERROR, errno, "close failed on %s",
+ rsyserr(FERROR_XFER, errno, "close failed on %s",
full_fname(dest));
return -1;
}
} while ((rc = access(path, 0)) == 0 && counter != start);
if (verbose > 0) {
- rprintf(FINFO,"renaming %s to %s because of text busy\n",
+ rprintf(FWARNING, "renaming %s to %s because of text busy\n",
fname, path);
}
}
/** Turn a user name into a uid */
-int name_to_uid(const char *name, uid_t *uid)
+int name_to_uid(const char *name, uid_t *uid_p)
{
struct passwd *pass;
if (!name || !*name)
return 0;
- pass = getpwnam(name);
- if (pass) {
- *uid = pass->pw_uid;
- return 1;
- }
- return 0;
+ if (!(pass = getpwnam(name)))
+ return 0;
+ *uid_p = pass->pw_uid;
+ return 1;
}
/** Turn a group name into a gid */
-int name_to_gid(const char *name, gid_t *gid)
+int name_to_gid(const char *name, gid_t *gid_p)
{
struct group *grp;
if (!name || !*name)
return 0;
- grp = getgrnam(name);
- if (grp) {
- *gid = grp->gr_gid;
- return 1;
- }
- return 0;
+ if (!(grp = getgrnam(name)))
+ return 0;
+ *gid_p = grp->gr_gid;
+ return 1;
}
/** Lock a byte range in a open file */
s = ".";
if (sanitize_paths)
- s = sanitize_path(NULL, s, "", 0, NULL);
+ s = sanitize_path(NULL, s, "", 0);
else
s = strdup(s);
if (!s)
* Specify NULL to get the default of "module_dir".
*
* The depth var is a count of how many '..'s to allow at the start of the
- * path. If symlink is set, combine its value with the "p" value to get
- * the target path, and **return NULL if any '..'s try to escape**.
+ * path.
*
* We also clean the path in a manner similar to clean_fname() but with a
* few differences:
* ALWAYS collapses ".." elements (except for those at the start of the
* string up to "depth" deep). If the resulting name would be empty,
* change it into a ".". */
-char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth,
- const char *symlink)
+char *sanitize_path(char *dest, const char *p, const char *rootdir, int depth)
{
- char *start, *sanp, *save_dest = dest;
+ char *start, *sanp;
int rlen = 0, leave_one_dotdir = relative_paths;
- if (symlink && *symlink == '/') {
- p = symlink;
- symlink = "";
- }
-
if (dest != p) {
int plen = strlen(p);
if (*p == '/') {
}
start = sanp = dest + rlen;
- while (1) {
- if (*p == '\0') {
- if (!symlink || !*symlink)
- break;
- while (sanp != start && sanp[-1] != '/') {
- /* strip last element */
- sanp--;
- }
- /* Append a relative symlink */
- p = symlink;
- symlink = "";
- }
+ while (*p) {
/* discard leading or extra slashes */
if (*p == '/') {
p++;
if (*p == '.' && p[1] == '.' && (p[2] == '/' || p[2] == '\0')) {
/* ".." component followed by slash or end */
if (depth <= 0 || sanp != start) {
- if (symlink && sanp == start) {
- if (!save_dest)
- free(dest);
- return NULL;
- }
p += 2;
if (sanp != start) {
/* back up sanp one level */
curr_dir_depth = count_dir_elements(curr_dir + module_dirlen);
}
+ if (verbose >= 5 && !set_path_only)
+ rprintf(FINFO, "[%s] push_dir(%s)\n", who_am_i(), curr_dir);
+
return 1;
}
if (sanitize_paths)
curr_dir_depth = count_dir_elements(curr_dir + module_dirlen);
+ if (verbose >= 5)
+ rprintf(FINFO, "[%s] pop_dir(%s)\n", who_am_i(), curr_dir);
+
return 1;
}