int file_total = 0; /* total of all active items over all file-lists */
int flist_eof = 0; /* all the file-lists are now known */
+/* Starting from protocol version 26, we always use 64-bit ino_t and dev_t
+ * internally, even if this platform does not allow files to have 64-bit inums.
+ * The only exception is if we're on a platform with no 64-bit type at all.
+ *
+ * Because we use read_longint() to get these off the wire, if you transfer
+ * devices or (for protocols < 30) hardlinks with dev or inum > 2**32 to a
+ * machine with no 64-bit types then you will get an overflow error.
+ *
+ * Note that if you transfer devices from a 64-bit-devt machine (say, Solaris)
+ * to a 32-bit-devt machine (say, Linux-2.2/x86) then the device numbers will
+ * be truncated. But it's a kind of silly thing to do anyhow. */
+
/* The tmp_* vars are used as a cache area by make_file() to store data
* that the sender doesn't need to remember in its file list. The data
* will survive just long enough to be used by send_file_entry(). */
return file;
}
-/**
- * Create a file_struct for a named file by reading its stat()
- * information and performing extensive checks against global
- * options.
- *
- * @return the new file, or NULL if there was an error or this file
- * should be excluded.
+/* Create a file_struct for a named file by reading its stat() information
+ * and performing extensive checks against global options.
*
- * @todo There is a small optimization opportunity here to avoid
- * stat()ing the file in some circumstances, which has a certain cost.
- * We are called immediately after doing readdir(), and so we may
- * already know the d_type of the file. We could for example avoid
- * statting directories if we're not recursing, but this is not a very
- * important case. Some systems may not have d_type.
- **/
+ * Returns a pointer to the new file struct, or NULL if there was an error
+ * or this file should be excluded. */
struct file_struct *make_file(const char *fname, struct file_list *flist,
STRUCT_STAT *stp, int flags, int filter_level)
{
static char *lastdir;
static int lastdir_len = -1;
struct file_struct *file;
- STRUCT_STAT st;
char thisname[MAXPATHLEN];
char linkname[MAXPATHLEN];
int alloc_len, basename_len, linkname_len;
int extra_len = file_extra_cnt * EXTRA_LEN;
const char *basename;
alloc_pool_t *pool;
+ STRUCT_STAT st;
char *bp;
if (strlcpy(thisname, fname, sizeof thisname) >= sizeof thisname) {
{
struct file_list *flist;
- flist = new(struct file_list);
+ flist = new0(struct file_list);
if (!flist)
out_of_memory(msg);
- memset(flist, 0, sizeof flist[0]);
-
if (flags & FLIST_TEMP) {
if (!(flist->file_pool = pool_create(SMALL_EXTENT, 0,
out_of_memory, POOL_INTERN)))