Commit 54410882 authored by Wayne Davison's avatar Wayne Davison

Added the relnamecache structure and improved some variable names.

parent d0a6cdb6
......@@ -1495,8 +1495,9 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname,
char *start, char *limit, int flags, int is_dot_dir)
{
struct file_struct *file;
item_list *rel_list;
char **ep, *slash;
item_list *relname_list;
relnamecache **rnpp;
char *slash;
int len, need_new_dir;
flags &= ~FLAG_XFER_DIR;
......@@ -1548,23 +1549,23 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname,
return; /* dir must have vanished */
len = strlen(limit+1);
memcpy(&rel_list, F_DIR_RELS_P(lastpath_struct), sizeof rel_list);
if (!rel_list) {
if (!(rel_list = new0(item_list)))
memcpy(&relname_list, F_DIR_RELNAMES_P(lastpath_struct), sizeof relname_list);
if (!relname_list) {
if (!(relname_list = new0(item_list)))
out_of_memory("send_implied_dirs");
memcpy(F_DIR_RELS_P(lastpath_struct), &rel_list, sizeof rel_list);
memcpy(F_DIR_RELNAMES_P(lastpath_struct), &relname_list, sizeof relname_list);
}
ep = EXPAND_ITEM_LIST(rel_list, char *, 32);
if (!(*ep = new_array(char, 1 + len + 1)))
rnpp = EXPAND_ITEM_LIST(relname_list, relnamecache *, 32);
if (!(*rnpp = (relnamecache*)new_array(char, sizeof (relnamecache) + len)))
out_of_memory("send_implied_dirs");
**ep = is_dot_dir;
strlcpy(*ep + 1, limit+1, len + 1);
(*rnpp)->is_dot_dir = is_dot_dir;
strlcpy((*rnpp)->fname, limit+1, len + 1);
}
static void send1extra(int f, struct file_struct *file, struct file_list *flist)
{
char fbuf[MAXPATHLEN];
item_list *rel_list;
item_list *relname_list;
int len, dlen, flags = FLAG_DIVERT_DIRS | FLAG_XFER_DIR;
size_t j;
......@@ -1584,17 +1585,18 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
if (!relative_paths)
return;
memcpy(&rel_list, F_DIR_RELS_P(file), sizeof rel_list);
if (!rel_list)
memcpy(&relname_list, F_DIR_RELNAMES_P(file), sizeof relname_list);
if (!relname_list)
return;
for (j = 0; j < rel_list->count; j++) {
char *slash, *ep = ((char**)rel_list->items)[j];
int is_dot_dir = *ep;
for (j = 0; j < relname_list->count; j++) {
char *slash;
relnamecache *rnp = ((relnamecache**)relname_list->items)[j];
int is_dot_dir = rnp->is_dot_dir;
fbuf[dlen] = '/';
len = strlcpy(fbuf + dlen + 1, ep+1, sizeof fbuf - dlen - 1);
free(ep);
len = strlcpy(fbuf + dlen + 1, rnp->fname, sizeof fbuf - dlen - 1);
free(rnp);
if (len >= (int)sizeof fbuf)
continue; /* Impossible... */
......@@ -1622,7 +1624,7 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
}
}
free(rel_list);
free(relname_list);
}
void send_extra_file_list(int f, int at_least)
......
......@@ -625,7 +625,7 @@ extern int xattrs_ndx;
#define F_HL_PREV(f) OPT_EXTRA(f, LEN64_BUMP(f)+inc_recurse)->num /* non-dirs */
#define F_DIR_NODE_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) \
+ DIRNODE_EXTRA_CNT - 1)->num) /* sender dirs */
#define F_DIR_RELS_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + DIRNODE_EXTRA_CNT \
#define F_DIR_RELNAMES_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + DIRNODE_EXTRA_CNT \
+ PTR_EXTRA_CNT - 1)->num) /* sender dirs */
#define F_DIR_DEFACL(f) OPT_EXTRA(f, LEN64_BUMP(f))->unum /* receiver dirs */
#define F_DIR_DEV_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + ACL_BUMP(f) \
......@@ -813,6 +813,11 @@ typedef struct {
#define RL_DUMP_COMMENTS (1<<1)
#define RL_CONVERT (1<<2)
typedef struct {
char is_dot_dir;
char fname[1]; /* has variable size */
} relnamecache;
#include "byteorder.h"
#include "lib/mdigest.h"
#include "lib/wildmatch.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment