- if (!file->basename) out_of_memory("receive_file_entry 1");
-
-
- file->length = read_longint(f);
- file->modtime = (flags & SAME_TIME) ? last_time : (time_t)read_int(f);
- file->mode = (flags & SAME_MODE) ? last_mode : (mode_t)read_int(f);
- if (preserve_uid)
- file->uid = (flags & SAME_UID) ? last_uid : (uid_t)read_int(f);
- if (preserve_gid)
- file->gid = (flags & SAME_GID) ? last_gid : (gid_t)read_int(f);
- if (preserve_devices && IS_DEVICE(file->mode))
- file->rdev = (flags & SAME_RDEV) ? last_rdev : (dev_t)read_int(f);
-
- if (preserve_links && S_ISLNK(file->mode)) {
- int l = read_int(f);
- file->link = (char *)malloc(l+1);
- if (!file->link) out_of_memory("receive_file_entry 2");
- read_buf(f,file->link,l);
- file->link[l] = 0;
- }
+ file = (struct file_struct *)malloc(sizeof(*file));
+ if (!file) out_of_memory("receive_file_entry");
+ memset((char *)file, 0, sizeof(*file));
+ (*fptr) = file;
+
+ if (l2 >= MAXPATHLEN-l1) overflow("receive_file_entry");
+
+ strlcpy(thisname,lastname,l1);
+ read_sbuf(f,&thisname[l1],l2);
+ thisname[l1+l2] = 0;
+
+ strlcpy(lastname,thisname,MAXPATHLEN-1);
+ lastname[MAXPATHLEN-1] = 0;
+
+ clean_fname(thisname);
+
+ if ((p = strrchr(thisname,'/'))) {
+ static char *lastdir;
+ *p = 0;
+ if (lastdir && strcmp(thisname, lastdir)==0) {
+ file->dirname = lastdir;
+ } else {
+ file->dirname = strdup(thisname);
+ lastdir = file->dirname;
+ }
+ file->basename = strdup(p+1);
+ } else {
+ file->dirname = NULL;
+ file->basename = strdup(thisname);
+ }
+
+ if (!file->basename) out_of_memory("receive_file_entry 1");
+
+
+ file->flags = flags;
+ file->length = read_longint(f);
+ file->modtime = (flags & SAME_TIME) ? last_time : (time_t)read_int(f);
+ file->mode = (flags & SAME_MODE) ? last_mode : (mode_t)read_int(f);
+ if (preserve_uid)
+ file->uid = (flags & SAME_UID) ? last_uid : (uid_t)read_int(f);
+ if (preserve_gid)
+ file->gid = (flags & SAME_GID) ? last_gid : (gid_t)read_int(f);
+ if (preserve_devices && IS_DEVICE(file->mode))
+ file->rdev = (flags & SAME_RDEV) ? last_rdev : (dev_t)read_int(f);
+
+ if (preserve_links && S_ISLNK(file->mode)) {
+ int l = read_int(f);
+ file->link = (char *)malloc(l+1);
+ if (!file->link) out_of_memory("receive_file_entry 2");
+ read_sbuf(f,file->link,l);
+ }