a "struct file_list *", which allows us to call it with a copy of the
current file_struct entry that we've modified. This is better than
modifying the entry directly because the latter causes the shared
memory between the generator and the receiver to slowly vanish as
the in-memory changes happen.
/* choose whether to skip a particular file */
/* choose whether to skip a particular file */
-static int skip_file(char *fname,
- struct file_struct *file, STRUCT_STAT *st)
+static int skip_file(char *fname, struct file_struct *file, STRUCT_STAT *st)
{
if (st->st_size != file->length) {
return 0;
{
if (st->st_size != file->length) {
return 0;
* @note This comment was added later by mbp who was trying to work it
* out. It might be wrong.
**/
* @note This comment was added later by mbp who was trying to work it
* out. It might be wrong.
**/
-void recv_generator(char *fname, struct file_list *flist, int i, int f_out)
+void recv_generator(char *fname, struct file_struct *file, int i, int f_out)
{
int fd;
STRUCT_STAT st;
struct map_struct *mapbuf;
int statret;
{
int fd;
STRUCT_STAT st;
struct map_struct *mapbuf;
int statret;
- struct file_struct *file = flist->files[i];
char *fnamecmp;
char fnamecmpbuf[MAXPATHLEN];
extern char *compare_dest;
char *fnamecmp;
char fnamecmpbuf[MAXPATHLEN];
extern char *compare_dest;
extern int only_existing;
extern int orig_umask;
extern int only_existing;
extern int orig_umask;
+ if (list_only)
+ return;
if (verbose > 2)
rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
if (verbose > 2)
rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
- if (verbose > 3)
- rprintf(FINFO,"gen mapped %s of size %.0f\n",fnamecmp,(double)st.st_size);
+ if (verbose > 3) {
+ rprintf(FINFO,"gen mapped %s of size %.0f\n", fnamecmp,
+ (double)st.st_size);
+ }
if (verbose > 2)
rprintf(FINFO, "generating and sending sums for %d\n", i);
if (verbose > 2)
rprintf(FINFO, "generating and sending sums for %d\n", i);
for (i = 0; i < flist->count; i++) {
struct file_struct *file = flist->files[i];
for (i = 0; i < flist->count; i++) {
struct file_struct *file = flist->files[i];
- mode_t saved_mode = file->mode;
- if (!file->basename) continue;
+ struct file_struct copy;
+ if (!file->basename)
+ continue;
/* we need to ensure that any directories we create have writeable
permissions initially so that we can create the files within
them. This is then fixed after the files are transferred */
/* we need to ensure that any directories we create have writeable
permissions initially so that we can create the files within
them. This is then fixed after the files are transferred */
- if (!am_root && S_ISDIR(file->mode)) {
- file->mode |= S_IWUSR; /* user write */
+ if (!am_root && S_ISDIR(file->mode) && !(file->mode & S_IWUSR)) {
+ copy = *file;
/* XXX: Could this be causing a problem on SCO? Perhaps their
* handling of permissions is strange? */
/* XXX: Could this be causing a problem on SCO? Perhaps their
* handling of permissions is strange? */
+ copy.mode |= S_IWUSR; /* user write */
+ file = ©
}
recv_generator(local_name? local_name
}
recv_generator(local_name? local_name
- : f_name_to(file,fbuf,sizeof fbuf), flist, i, f);
-
- file->mode = saved_mode;
+ : f_name_to(file,fbuf,sizeof fbuf), file, i, f);
for (i = read_int(f_recv); i != -1; i = read_int(f_recv)) {
struct file_struct *file = flist->files[i];
recv_generator(local_name? local_name
for (i = read_int(f_recv); i != -1; i = read_int(f_recv)) {
struct file_struct *file = flist->files[i];
recv_generator(local_name? local_name
- : f_name_to(file,fbuf,sizeof fbuf), flist, i, f);
+ : f_name_to(file,fbuf,sizeof fbuf), file, i, f);