+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2003-2007 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of Kern Sibbald.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
/*
* attr.c Unpack an Attribute record returned from the tape
*
*
* Version $Id$
*/
-/*
- Copyright (C) 2003-2005 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
- */
#include "bacula.h"
#include "jcr.h"
+#include "lib/breg.h"
-extern const int win32_client;
-
-ATTR *new_attr()
+ATTR *new_attr(JCR *jcr)
{
ATTR *attr = (ATTR *)malloc(sizeof(ATTR));
memset(attr, 0, sizeof(ATTR));
attr->ofname = get_pool_memory(PM_FNAME);
attr->olname = get_pool_memory(PM_FNAME);
attr->attrEx = get_pool_memory(PM_FNAME);
+ attr->jcr = jcr;
+ attr->uid = getuid();
return attr;
}
return 1;
}
+#if defined(HAVE_WIN32)
static void strip_double_slashes(char *fname)
{
char *p = fname;
while (p && *p) {
- p = strchr(p, '/');
- if (p && p[1] == '/') {
- strcpy(p, p+1);
- }
- if (p) {
+ p = strpbrk(p, "/\\");
+ if (p != NULL) {
+ if (IsPathSeparator(p[1])) {
+ strcpy(p, p+1);
+ }
p++;
}
}
}
+#endif
/*
* Build attr->ofname from attr->fname and
* every filename if a prefix is supplied.
*
*/
- if (jcr->where[0] == 0) {
+
+ if (jcr->where_bregexp) {
+ char *ret;
+ apply_bregexps(attr->fname, jcr->where_bregexp, &ret);
+ pm_strcpy(attr->ofname, ret);
+
+ if (attr->type == FT_LNKSAVED || attr->type == FT_LNK) {
+ /* Always add prefix to hard links (FT_LNKSAVED) and
+ * on user request to soft links
+ */
+
+ if ((attr->type == FT_LNKSAVED || jcr->prefix_links)) {
+ apply_bregexps(attr->lname, jcr->where_bregexp, &ret);
+ pm_strcpy(attr->olname, ret);
+
+ } else {
+ pm_strcpy(attr->olname, attr->lname);
+ }
+ }
+
+ } else if (jcr->where[0] == 0) {
pm_strcpy(attr->ofname, attr->fname);
pm_strcpy(attr->olname, attr->lname);
+
} else {
const char *fn;
int wherelen = strlen(jcr->where);
pm_strcpy(attr->ofname, jcr->where); /* copy prefix */
- if (win32_client && attr->fname[1] == ':') {
+#if defined(HAVE_WIN32)
+ if (attr->fname[1] == ':') {
attr->fname[1] = '/'; /* convert : to / */
}
+#endif
fn = attr->fname; /* take whole name */
/* Ensure where is terminated with a slash */
- if (jcr->where[wherelen-1] != '/' && fn[0] != '/') {
+ if (!IsPathSeparator(jcr->where[wherelen-1]) && !IsPathSeparator(fn[0])) {
pm_strcat(attr->ofname, "/");
}
pm_strcat(attr->ofname, fn); /* copy rest of name */
/* Always add prefix to hard links (FT_LNKSAVED) and
* on user request to soft links
*/
- if (attr->lname[0] == '/' &&
+ if (IsPathSeparator(attr->lname[0]) &&
(attr->type == FT_LNKSAVED || jcr->prefix_links)) {
pm_strcpy(attr->olname, jcr->where);
add_link = true;
attr->olname[0] = 0;
add_link = false;
}
- if (win32_client && attr->lname[1] == ':') {
+
+#if defined(HAVE_WIN32)
+ if (attr->lname[1] == ':') {
attr->lname[1] = '/'; /* turn : into / */
}
+#endif
fn = attr->lname; /* take whole name */
/* Ensure where is terminated with a slash */
- if (add_link && jcr->where[wherelen-1] != '/' && fn[0] != '/') {
+ if (add_link &&
+ !IsPathSeparator(jcr->where[wherelen-1]) &&
+ !IsPathSeparator(fn[0])) {
pm_strcat(attr->olname, "/");
}
pm_strcat(attr->olname, fn); /* copy rest of link */
}
}
- if (win32_client) {
- strip_double_slashes(attr->ofname);
- strip_double_slashes(attr->olname);
- }
+#if defined(HAVE_WIN32)
+ strip_double_slashes(attr->ofname);
+ strip_double_slashes(attr->olname);
+#endif
}
extern char *getuser(uid_t uid, char *name, int len);
char ec1[30];
char en1[30], en2[30];
char *p, *f;
+ guid_list *guid;
+ if (attr->type == FT_DELETED) { /* TODO: change this to get last seen values */
+ bsnprintf(buf, sizeof(buf),
+ "---------- - - - - ---------- -------- %s\n", attr->ofname);
+ Dmsg1(20, "%s", buf);
+ Jmsg(jcr, M_RESTORED, 1, "%s", buf);
+ return;
+ }
+
+ if (!jcr->id_list) {
+ jcr->id_list = new_guid_list();
+ }
+ guid = jcr->id_list;
p = encode_mode(attr->statp.st_mode, buf);
p += sprintf(p, " %2d ", (uint32_t)attr->statp.st_nlink);
- p += sprintf(p, "%-8.8s %-8.8s", getuser(attr->statp.st_uid, en1, sizeof(en1)),
- getgroup(attr->statp.st_gid, en2, sizeof(en2)));
- p += sprintf(p, "%10.10s ", edit_uint64(attr->statp.st_size, ec1));
+ p += sprintf(p, "%-8.8s %-8.8s",
+ guid->uid_to_name(attr->statp.st_uid, en1, sizeof(en1)),
+ guid->gid_to_name(attr->statp.st_gid, en2, sizeof(en2)));
+ p += sprintf(p, "%12.12s ", edit_int64(attr->statp.st_size, ec1));
p = encode_time(attr->statp.st_ctime, p);
*p++ = ' ';
*p++ = ' ';