/*
Bacula® - The Network Backup Solution
- Copyright (C) 2002-2007 Free Software Foundation Europe e.V.
+ Copyright (C) 2002-2008 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 plus additions
- that are listed in the file LICENSE.
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ 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.
struct cmdstruct { const char *key; int (*func)(UAContext *ua, TREE_CTX *tree); const char *help; };
static struct cmdstruct commands[] = {
+ { NT_("add"), markcmd, _("add dir/file to be restored recursively, wildcards allowed")},
{ NT_("cd"), cdcmd, _("change current directory")},
{ NT_("count"), countcmd, _("count marked files in and below the cd")},
+ { NT_("delete"), unmarkcmd, _("delete dir/file to be restored recursively in dir")},
{ NT_("dir"), dircmd, _("long list current directory, wildcards allowed")},
{ NT_(".dir"), dot_dircmd, _("long list current directory, wildcards allowed")},
{ NT_("done"), donecmd, _("leave file selection mode")},
"remove (unmark) files to be restored. No files are initially added, unless\n"
"you used the \"all\" keyword on the command line.\n"
"Enter \"done\" to leave this mode.\n\n"));
+ if (ua->api) user->signal(BNET_START_RTREE);
/*
* Enter interactive command handler allowing selection
* of individual files.
break;
}
}
+ if (ua->api) user->signal(BNET_END_RTREE);
ua->UA_sock = NULL; /* don't release restore socket */
stat = !ua->quit;
ua->quit = false;
int FileIndex;
JobId_t JobId;
-// Dmsg4(000, "Path=%s%s FI=%s JobId=%s\n", row[0], row[1],
-// row[2], row[3]);
+ Dmsg4(400, "Path=%s%s FI=%s JobId=%s\n", row[0], row[1],
+ row[2], row[3]);
if (*row[1] == 0) { /* no filename => directory */
if (!IsPathSeparator(*row[0])) { /* Must be Win32 directory */
type = TN_DIR_NLS;
return 1;
}
-
-
-extern char *getuser(uid_t uid, char *name, int len);
-extern char *getgroup(gid_t gid, char *name, int len);
-
/*
* This is actually the long form used for "dir"
*/
-static void ls_output(char *buf, const char *fname, const char *tag,
+static void ls_output(guid_list *guid, char *buf, const char *fname, const char *tag,
struct stat *statp, bool dot_cmd)
-
{
char *p;
const char *f;
*p++ = ',';
n = sprintf(p, "%d,", (uint32_t)statp->st_nlink);
p += n;
- n = sprintf(p, "%s,%s,", getuser(statp->st_uid, en1, sizeof(en1)),
- getgroup(statp->st_gid, en2, sizeof(en2)));
+ n = sprintf(p, "%s,%s,",
+ guid->uid_to_name(statp->st_uid, en1, sizeof(en1)),
+ guid->gid_to_name(statp->st_gid, en2, sizeof(en2)));
p += n;
- n = sprintf(p, "%s,", edit_uint64(statp->st_size, ec1));
+ n = sprintf(p, "%s,", edit_int64(statp->st_size, ec1));
p += n;
p = encode_time(statp->st_mtime, p);
*p++ = ',';
} else {
n = sprintf(p, " %2d ", (uint32_t)statp->st_nlink);
p += n;
- n = sprintf(p, "%-8.8s %-8.8s", getuser(statp->st_uid, en1, sizeof(en1)),
- getgroup(statp->st_gid, en2, sizeof(en2)));
+ n = sprintf(p, "%-8.8s %-8.8s",
+ guid->uid_to_name(statp->st_uid, en1, sizeof(en1)),
+ guid->gid_to_name(statp->st_gid, en2, sizeof(en2)));
p += n;
- n = sprintf(p, "%10.10s ", edit_uint64(statp->st_size, ec1));
+ n = sprintf(p, "%10.10s ", edit_int64(statp->st_size, ec1));
p += n;
if (statp->st_ctime > statp->st_mtime) {
time = statp->st_ctime;
struct stat statp;
char buf[1100];
char cwd[1100], *pcwd;
+ guid_list *guid;
if (!tree_node_has_child(tree->node)) {
ua->send_msg(_("Node %s has no children.\n"), tree->node->fname);
return 1;
}
+ guid = new_guid_list();
foreach_child(node, tree->node) {
const char *tag;
if (ua->argc == 1 || fnmatch(ua->argk[1], node->fname, 0) == 0) {
/* Something went wrong getting attributes -- print name */
memset(&statp, 0, sizeof(statp));
}
- ls_output(buf, cwd, tag, &statp, dot_cmd);
+ ls_output(guid, buf, cwd, tag, &statp, dot_cmd);
ua->send_msg("%s\n", buf);
}
}
+ free_guid_list(guid);
return 1;
}