/* 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;
}
}
file_checksum(fname,sum,st->st_size);
- if (protocol_version < 21) {
- return (memcmp(sum,file->sum,2) == 0);
- } else {
- return (memcmp(sum,file->sum,MD4_SUM_LENGTH) == 0);
- }
+ return memcmp(sum, file->sum, protocol_version < 21? 2
+ : MD4_SUM_LENGTH) == 0;
}
if (size_only) {
/*
- * NULL sum_struct means we have no checksums
+ * NULL sum_struct means we have no checksums
*/
-
void write_sum_head(int f, struct sum_struct *sum)
{
static struct sum_struct null_sum;
sum->remainder = (len % blength);
if (sum->count && verbose > 2) {
- rprintf(FINFO, "count=%ld rem=%u blength=%u s2length=%d flength=%.0f\n",
- (long)sum->count, sum->remainder, sum->blength,
+ rprintf(FINFO, "count=%.0f rem=%u blength=%u s2length=%d flength=%.0f\n",
+ (double)sum->count, sum->remainder, sum->blength,
sum->s2length, (double)sum->flength);
}
}
write_sum_head(f_out, &sum);
for (i = 0; i < sum.count; i++) {
- int n1 = MIN(len, sum.blength);
+ unsigned int n1 = MIN(len, sum.blength);
char *map = map_ptr(buf, offset, n1);
uint32 sum1 = get_checksum1(map, n1);
char sum2[SUM_LENGTH];
if (verbose > 3) {
rprintf(FINFO,
- "chunk[%ld] offset=%.0f len=%d sum1=%08lx\n",
- (long)i,(double)offset,n1,(unsigned long)sum1);
+ "chunk[%.0f] offset=%.0f len=%u sum1=%08lx\n",
+ (double)i, (double)offset, n1,
+ (unsigned long)sum1);
}
write_int(f_out, sum1);
write_buf(f_out, sum2, sum.s2length);
* @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;
- struct file_struct *file = flist->files[i];
char *fnamecmp;
char fnamecmpbuf[MAXPATHLEN];
extern char *compare_dest;
extern int only_existing;
extern int orig_umask;
- if (list_only) return;
+ if (list_only)
+ return;
if (verbose > 2)
rprintf(FINFO,"recv_generator(%s,%d)\n",fname,i);
else
mapbuf = NULL;
- 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);
}
-
void generate_files(int f,struct file_list *flist,char *local_name,int f_recv)
{
int 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 */
- 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? */
+ copy.mode |= S_IWUSR; /* user write */
+ file = ©
}
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);
}
phase++;
/* files can cycle through the system more than once
* to catch initial checksum errors */
- for (i = read_int(f_recv); i != -1; i = read_int(f_recv)) {
+ while ((i = read_int(f_recv)) != -1) {
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);
}
phase++;