/*
* attr.c Unpack an Attribute record returned from the tape
- *
+ *
* Kern Sibbald, June MMIII (code pulled from filed/restore.c and updated)
*
* Version $Id$
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2003-2004 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
int unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr)
{
char *p;
- /*
+ /*
* An Attributes record consists of:
* File_index
* Type (FT_types)
{ }
while (*p++ != ' ') /* skip type */
{ }
-
+
attr->fname = p; /* set filname position */
while (*p++ != 0) /* skip filename */
{ }
attr->lname = p; /* set link position */
while (*p++ != 0) /* skip link */
{ }
- pm_strcpy(&attr->attrEx, p); /* copy extended attributes, if any */
+ pm_strcpy(attr->attrEx, p); /* copy extended attributes, if any */
if (attr->data_stream) {
int64_t val;
Dmsg7(200, "unpack_attr FI=%d Type=%d fname=%s attr=%s lname=%s attrEx=%s ds=%d\n",
attr->file_index, attr->type, attr->fname, attr->attr, attr->lname,
attr->attrEx, attr->data_stream);
- *mp_chr(attr->ofname) = 0;
- *mp_chr(attr->olname) = 0;
+ *attr->ofname = 0;
+ *attr->olname = 0;
return 1;
}
/*
* Build attr->ofname from attr->fname and
- * attr->olname from attr->olname
+ * attr->olname from attr->olname
*/
void build_attr_output_fnames(JCR *jcr, ATTR *attr)
{
* files are put where the user wants.
*
* We do a little jig here to handle Win32 files with
- * a drive letter -- we simply strip the drive: from
+ * a drive letter -- we simply change the drive
+ * from, for example, c: to c/ for
* every filename if a prefix is supplied.
- *
+ *
*/
if (jcr->where[0] == 0) {
- pm_strcpy(&attr->ofname, attr->fname);
- pm_strcpy(&attr->olname, attr->lname);
+ 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 */
+ pm_strcpy(attr->ofname, jcr->where); /* copy prefix */
if (win32_client && attr->fname[1] == ':') {
- fn = attr->fname+2; /* skip over drive: */
- } else {
- fn = attr->fname; /* take whole name */
+ attr->fname[1] = '/'; /* convert : to / */
}
+ fn = attr->fname; /* take whole name */
/* Ensure where is terminated with a slash */
if (jcr->where[wherelen-1] != '/' && fn[0] != '/') {
- pm_strcat(&attr->ofname, "/");
- }
- pm_strcat(&attr->ofname, fn); /* copy rest of name */
+ pm_strcat(attr->ofname, "/");
+ }
+ pm_strcat(attr->ofname, fn); /* copy rest of name */
/*
* Fixup link name -- if it is an absolute path
*/
/* Always add prefix to hard links (FT_LNKSAVED) and
* on user request to soft links
*/
- if (attr->lname[0] == '/' &&
+ if (attr->lname[0] == '/' &&
(attr->type == FT_LNKSAVED || jcr->prefix_links)) {
- pm_strcpy(&attr->olname, jcr->where);
+ pm_strcpy(attr->olname, jcr->where);
add_link = true;
} else {
- mp_chr(attr->olname)[0] = 0;
+ attr->olname[0] = 0;
add_link = false;
}
- if (win32_client && attr->lname[1] == ':') {
- fn = attr->lname+2; /* skip over drive: */
- } else {
- fn = attr->lname; /* take whole name */
+ if (win32_client && attr->lname[1] == ':') {
+ attr->lname[1] = '/'; /* turn : into / */
}
+ fn = attr->lname; /* take whole name */
/* Ensure where is terminated with a slash */
- if (add_link && jcr->where[wherelen-1] != '/' && fn[0] != '/') {
- pm_strcat(&attr->olname, "/");
- }
- pm_strcat(&attr->olname, fn); /* copy rest of link */
+ if (add_link && jcr->where[wherelen-1] != '/' && fn[0] != '/') {
+ pm_strcat(attr->olname, "/");
+ }
+ pm_strcat(attr->olname, fn); /* copy rest of link */
}
}
}
-extern char *getuser(uid_t uid);
-extern char *getgroup(gid_t gid);
+extern char *getuser(uid_t uid, char *name, int len);
+extern char *getgroup(gid_t gid, char *name, int len);
/*
* Print an ls style message, also send M_RESTORED
*/
void print_ls_output(JCR *jcr, ATTR *attr)
{
- char buf[5000];
+ char buf[5000];
char ec1[30];
+ char en1[30], en2[30];
char *p, *f;
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), getgroup(attr->statp.st_gid));
+ 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, "%8.8s ", edit_uint64(attr->statp.st_size, ec1));
p = encode_time(attr->statp.st_ctime, p);
*p++ = ' ';
*p++ = ' ';
- for (f=mp_chr(attr->ofname); *f && (p-buf) < (int)sizeof(buf)-10; ) {
+ for (f=attr->ofname; *f && (p-buf) < (int)sizeof(buf)-10; ) {
*p++ = *f++;
}
if (attr->type == FT_LNK) {
*p++ = '>';
*p++ = ' ';
/* Copy link name */
- for (f=mp_chr(attr->olname); *f && (p-buf) < (int)sizeof(buf)-10; ) {
+ for (f=attr->olname; *f && (p-buf) < (int)sizeof(buf)-10; ) {
*p++ = *f++;
}
}
*p++ = '\n';
*p = 0;
Dmsg1(20, "%s", buf);
- Jmsg(jcr, M_RESTORED, 0, "%s", buf);
+ Jmsg(jcr, M_RESTORED, 1, "%s", buf);
}