- static struct file_struct file;
- struct stat st;
- char sum[SUM_LENGTH];
-
- bzero(sum,SUM_LENGTH);
-
- if (lstat(fname,&st) != 0) {
- fprintf(FERROR,"%s: %s\n",
- fname,strerror(errno));
- return NULL;
- }
-
- if (S_ISDIR(st.st_mode) && !recurse) {
- fprintf(FERROR,"skipping directory %s\n",fname);
- return NULL;
- }
-
- if (one_file_system && st.st_dev != filesystem_dev)
- return NULL;
-
- if (!match_file_name(fname,&st))
- return NULL;
-
- if (verbose > 2)
- fprintf(FERROR,"make_file(%s)\n",fname);
-
- bzero((char *)&file,sizeof(file));
-
- file.name = strdup(fname);
- file.modtime = st.st_mtime;
- file.length = st.st_size;
- file.mode = st.st_mode;
- file.uid = st.st_uid;
- file.gid = st.st_gid;
- file.dev = st.st_dev;
- file.inode = st.st_ino;
+ struct file_struct *file;
+ struct stat st;
+ char sum[SUM_LENGTH];
+ char *p;
+ char cleaned_name[MAXPATHLEN];
+
+ strncpy(cleaned_name, fname, MAXPATHLEN-1);
+ cleaned_name[MAXPATHLEN-1] = 0;
+ clean_fname(cleaned_name);
+ fname = cleaned_name;
+
+ bzero(sum,SUM_LENGTH);
+
+ if (link_stat(fname,&st) != 0) {
+ fprintf(FERROR,"%s: %s\n",
+ fname,strerror(errno));
+ return NULL;
+ }
+
+ if (S_ISDIR(st.st_mode) && !recurse) {
+ fprintf(FERROR,"skipping directory %s\n",fname);
+ return NULL;
+ }
+
+ if (one_file_system && st.st_dev != filesystem_dev)
+ return NULL;
+
+ if (!match_file_name(fname,&st))
+ return NULL;
+
+ if (verbose > 2)
+ fprintf(FERROR,"make_file(%s)\n",fname);
+
+ file = (struct file_struct *)malloc(sizeof(*file));
+ if (!file) out_of_memory("make_file");
+ bzero((char *)file,sizeof(*file));
+
+ if ((p = strrchr(fname,'/'))) {
+ static char *lastdir;
+ *p = 0;
+ if (lastdir && strcmp(fname, lastdir)==0) {
+ file->dirname = lastdir;
+ } else {
+ file->dirname = strdup(fname);
+ lastdir = file->dirname;
+ }
+ file->basename = strdup(p+1);
+ *p = '/';
+ } else {
+ file->dirname = NULL;
+ file->basename = strdup(fname);
+ }
+
+ file->modtime = st.st_mtime;
+ file->length = st.st_size;
+ file->mode = st.st_mode;
+ file->uid = st.st_uid;
+ file->gid = st.st_gid;
+ file->dev = st.st_dev;
+ file->inode = st.st_ino;