directory->dump = directory->idump = NULL;
directory->orig = NULL;
directory->flags = false;
- if (namelen && ISSLASH (name[namelen - 1]))
+ if (namelen > 1 && ISSLASH (name[namelen - 1]))
namelen--;
directory->name = xmalloc (namelen + 1);
memcpy (directory->name, name, namelen);
{
struct stat st;
if (deref_stat (dereference_option, p, &st) != 0)
- stat_diag (name);
+ {
+ if (errno != ENOENT)
+ stat_diag (directory->name);
+ /* else: should have been already reported */
+ }
else
directory->mtime = get_stat_mtime (&st);
}
if (one_file_system_option && device != stat_data->st_dev
/* ... except if it was explicitely given in the command line */
&& !is_individual_file (name_buffer))
+ /* FIXME:
+ WARNOPT (WARN_XDEV,
+ (0, 0,
+ _("%s: directory is on a different filesystem; not dumped"),
+ quotearg_colon (directory->name)));
+ */
directory->children = NO_CHILDREN;
else if (flag & PD_FORCE_CHILDREN)
{
scan_directory (char *dir, dev_t device, bool cmdline)
{
char *dirp = savedir (dir); /* for scanning directory */
- char *name_buffer; /* directory, `/', and directory member */
- size_t name_buffer_size; /* allocated size of name_buffer, minus 2 */
- size_t name_length; /* used length in name_buffer */
+ namebuf_t nbuf;
+ char *tmp;
struct stat stat_data;
struct directory *directory;
char ch;
if (! dirp)
savedir_error (dir);
- name_buffer_size = strlen (dir) + NAME_FIELD_SIZE;
- name_buffer = xmalloc (name_buffer_size + 2);
- strcpy (name_buffer, dir);
- zap_slashes (name_buffer);
+ tmp = xstrdup (dir);
+ zap_slashes (tmp);
- if (deref_stat (dereference_option, name_buffer, &stat_data))
+ if (deref_stat (dereference_option, tmp, &stat_data))
{
- stat_diag (name_buffer);
- /* FIXME: used to be
- children = CHANGED_CHILDREN;
- but changed to: */
- free (name_buffer);
+ dir_removed_diag (tmp, cmdline, stat_diag);
+ free (tmp);
free (dirp);
return NULL;
}
- directory = procdir (name_buffer, &stat_data, device,
+ directory = procdir (tmp, &stat_data, device,
(cmdline ? PD_FORCE_INIT : 0),
&ch);
- name_length = strlen (name_buffer);
- if (! ISSLASH (name_buffer[name_length - 1]))
- {
- name_buffer[name_length] = DIRECTORY_SEPARATOR;
- /* name_buffer has been allocated an extra slot */
- name_buffer[++name_length] = 0;
- }
+ free (tmp);
+
+ nbuf = namebuf_create (dir);
if (dirp && directory->children != NO_CHILDREN)
{
char *entry; /* directory entry being scanned */
- size_t entrylen; /* length of directory entry */
dumpdir_iter_t itr;
makedumpdir (directory, dirp);
entry;
entry = dumpdir_next (itr))
{
- entrylen = strlen (entry);
- if (name_buffer_size <= entrylen - 1 + name_length)
- {
- do
- name_buffer_size += NAME_FIELD_SIZE;
- while (name_buffer_size <= entrylen - 1 + name_length);
- name_buffer = xrealloc (name_buffer, name_buffer_size + 2);
- }
- strcpy (name_buffer + name_length, entry + 1);
+ char *full_name = namebuf_name (nbuf, entry + 1);
if (*entry == 'I') /* Ignored entry */
*entry = 'N';
- else if (excluded_name (name_buffer))
+ else if (excluded_name (full_name))
*entry = 'N';
else
{
- if (deref_stat (dereference_option, name_buffer, &stat_data))
+ if (deref_stat (dereference_option, full_name, &stat_data))
{
- stat_diag (name_buffer);
+ file_removed_diag (full_name, false, stat_diag);
*entry = 'N';
continue;
}
else if (directory->children == ALL_CHILDREN)
pd_flag |= PD_FORCE_CHILDREN | ALL_CHILDREN;
*entry = 'D';
- procdir (name_buffer, &stat_data, device, pd_flag, entry);
+ procdir (full_name, &stat_data, device, pd_flag, entry);
}
else if (one_file_system_option && device != stat_data.st_dev)
free (itr);
}
- free (name_buffer);
+ namebuf_free (nbuf);
+
if (dirp)
free (dirp);
uintmax_t u;
time_t sec;
long int nsec;
- char *buf = 0;
- size_t bufsize;
+ char *buf = NULL;
+ size_t bufsize = 0;
char *ebuf;
long lineno = 1;
read_directory_file (void)
{
int fd;
- char *buf = 0;
- size_t bufsize;
+ char *buf = NULL;
+ size_t bufsize = 0;
int flags = O_RDWR | O_CREAT;
if (incremental_level == 0)
return;
}
+ /* Consume the first name from the name list and reset the
+ list afterwards. This is done to change to the new
+ directory, if the first name is a chdir request (-C dir),
+ which is necessary to recreate absolute file names. */
+ name_from_list ();
+ blank_name_list ();
+
if (0 < getline (&buf, &bufsize, listed_incremental_stream))
{
char *ebuf;
if (! fp)
return;
- if (fseek (fp, 0L, SEEK_SET) != 0)
+ if (fseeko (fp, 0L, SEEK_SET) != 0)
seek_error (listed_incremental_option);
if (sys_truncate (fileno (fp)) != 0)
truncate_error (listed_incremental_option);