if (!initialised) {
initialised = 1;
- getcwd(curr_dir, sizeof curr_dir - 1);
+ if (getcwd(curr_dir, sizeof curr_dir - 1) == NULL) {
+ rsyserr(FERROR, errno, "getcwd()");
+ exit_cleanup(RERR_FILESELECT);
+ }
curr_dir_len = strlen(curr_dir);
}
return 1;
}
+/* This will make a relative path absolute and clean it up via clean_fname().
+ * Returns the string, which might be newly allocated, or NULL on error. */
+char *normalize_path(char *path, BOOL force_newbuf, unsigned int *len_ptr)
+{
+ unsigned int len;
+
+ if (*path != '/') { /* Make path absolute. */
+ int len = strlen(path);
+ if (curr_dir_len + 1 + len >= sizeof curr_dir)
+ return NULL;
+ curr_dir[curr_dir_len] = '/';
+ memcpy(curr_dir + curr_dir_len + 1, path, len + 1);
+ if (!(path = strdup(curr_dir)))
+ out_of_memory("normalize_path");
+ curr_dir[curr_dir_len] = '\0';
+ } else if (force_newbuf) {
+ if (!(path = strdup(path)))
+ out_of_memory("normalize_path");
+ }
+
+ len = clean_fname(path, CFN_COLLAPSE_DOT_DOT_DIRS | CFN_DROP_TRAILING_DOT_DIR);
+
+ if (len_ptr)
+ *len_ptr = len;
+
+ return path;
+}
+
/**
* Return a quoted string with the full pathname of the indicated filename.
* The string " (in MODNAME)" may also be appended. The returned pointer
return -1;
}
+void flist_ndx_push(flist_ndx_list *lp, int ndx)
+{
+ struct flist_ndx_item *item;
+
+ if (!(item = new(struct flist_ndx_item)))
+ out_of_memory("flist_ndx_push");
+ item->next = NULL;
+ item->ndx = ndx;
+ if (lp->tail)
+ lp->tail->next = item;
+ else
+ lp->head = item;
+ lp->tail = item;
+}
+
+int flist_ndx_pop(flist_ndx_list *lp)
+{
+ struct flist_ndx_item *next;
+ int ndx;
+
+ if (!lp->head)
+ return -1;
+
+ ndx = lp->head->ndx;
+ next = lp->head->next;
+ free(lp->head);
+ lp->head = next;
+ if (!next)
+ lp->tail = NULL;
+
+ return ndx;
+}
+
void *expand_item_list(item_list *lp, size_t item_size,
const char *desc, int incr)
{