/* 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;
/*
- * 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;
static void sum_sizes_sqroot(struct sum_struct *sum, uint64 len)
{
- extern int block_size;
- int blength, s2length, b;
+ extern unsigned int block_size;
+ unsigned int blength;
+ int s2length;
uint32 c;
uint64 l;
} else if (csum_length == SUM_LENGTH) {
s2length = SUM_LENGTH;
} else {
- b = BLOCKSUM_BIAS;
+ int b = BLOCKSUM_BIAS;
l = len;
while (l >>= 1) {
b += 2;
sum->remainder = (len % blength);
if (sum->count && verbose > 2) {
- rprintf(FINFO, "count=%ld rem=%ld blength=%ld s2length=%ld flength=%.0f\n",
- (long) sum->count, (long) sum->remainder,
- (long) sum->blength, (long) sum->s2length,
- (double) sum->flength);
+ 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);
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++;
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);
}
phase++;