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, ...@@ -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) char *start, char *limit, int flags, int is_dot_dir)
{ {
struct file_struct *file; struct file_struct *file;
item_list *rel_list; item_list *relname_list;
char **ep, *slash; relnamecache **rnpp;
char *slash;
int len, need_new_dir; int len, need_new_dir;
flags &= ~FLAG_XFER_DIR; flags &= ~FLAG_XFER_DIR;
...@@ -1548,23 +1549,23 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname, ...@@ -1548,23 +1549,23 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname,
return; /* dir must have vanished */ return; /* dir must have vanished */
len = strlen(limit+1); len = strlen(limit+1);
memcpy(&rel_list, F_DIR_RELS_P(lastpath_struct), sizeof rel_list); memcpy(&relname_list, F_DIR_RELNAMES_P(lastpath_struct), sizeof relname_list);
if (!rel_list) { if (!relname_list) {
if (!(rel_list = new0(item_list))) if (!(relname_list = new0(item_list)))
out_of_memory("send_implied_dirs"); 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); rnpp = EXPAND_ITEM_LIST(relname_list, relnamecache *, 32);
if (!(*ep = new_array(char, 1 + len + 1))) if (!(*rnpp = (relnamecache*)new_array(char, sizeof (relnamecache) + len)))
out_of_memory("send_implied_dirs"); out_of_memory("send_implied_dirs");
**ep = is_dot_dir; (*rnpp)->is_dot_dir = is_dot_dir;
strlcpy(*ep + 1, limit+1, len + 1); strlcpy((*rnpp)->fname, limit+1, len + 1);
} }
static void send1extra(int f, struct file_struct *file, struct file_list *flist) static void send1extra(int f, struct file_struct *file, struct file_list *flist)
{ {
char fbuf[MAXPATHLEN]; char fbuf[MAXPATHLEN];
item_list *rel_list; item_list *relname_list;
int len, dlen, flags = FLAG_DIVERT_DIRS | FLAG_XFER_DIR; int len, dlen, flags = FLAG_DIVERT_DIRS | FLAG_XFER_DIR;
size_t j; size_t j;
...@@ -1584,17 +1585,18 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist) ...@@ -1584,17 +1585,18 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist)
if (!relative_paths) if (!relative_paths)
return; return;
memcpy(&rel_list, F_DIR_RELS_P(file), sizeof rel_list); memcpy(&relname_list, F_DIR_RELNAMES_P(file), sizeof relname_list);
if (!rel_list) if (!relname_list)
return; return;
for (j = 0; j < rel_list->count; j++) { for (j = 0; j < relname_list->count; j++) {
char *slash, *ep = ((char**)rel_list->items)[j]; char *slash;
int is_dot_dir = *ep; relnamecache *rnp = ((relnamecache**)relname_list->items)[j];
int is_dot_dir = rnp->is_dot_dir;
fbuf[dlen] = '/'; fbuf[dlen] = '/';
len = strlcpy(fbuf + dlen + 1, ep+1, sizeof fbuf - dlen - 1); len = strlcpy(fbuf + dlen + 1, rnp->fname, sizeof fbuf - dlen - 1);
free(ep); free(rnp);
if (len >= (int)sizeof fbuf) if (len >= (int)sizeof fbuf)
continue; /* Impossible... */ continue; /* Impossible... */
...@@ -1622,7 +1624,7 @@ static void send1extra(int f, struct file_struct *file, struct file_list *flist) ...@@ -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) void send_extra_file_list(int f, int at_least)
......
...@@ -625,7 +625,7 @@ extern int xattrs_ndx; ...@@ -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_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) \ #define F_DIR_NODE_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) \
+ DIRNODE_EXTRA_CNT - 1)->num) /* sender dirs */ + 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 */ + PTR_EXTRA_CNT - 1)->num) /* sender dirs */
#define F_DIR_DEFACL(f) OPT_EXTRA(f, LEN64_BUMP(f))->unum /* receiver 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) \ #define F_DIR_DEV_P(f) (&OPT_EXTRA(f, LEN64_BUMP(f) + ACL_BUMP(f) \
...@@ -813,6 +813,11 @@ typedef struct { ...@@ -813,6 +813,11 @@ typedef struct {
#define RL_DUMP_COMMENTS (1<<1) #define RL_DUMP_COMMENTS (1<<1)
#define RL_CONVERT (1<<2) #define RL_CONVERT (1<<2)
typedef struct {
char is_dot_dir;
char fname[1]; /* has variable size */
} relnamecache;
#include "byteorder.h" #include "byteorder.h"
#include "lib/mdigest.h" #include "lib/mdigest.h"
#include "lib/wildmatch.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