* file named AUTHORS, in the root directory of this distribution.
*/
/*
- * $Id: amtape.c,v 1.40 2006/01/14 04:37:19 paddy_s Exp $
+ * $Id: amtape.c,v 1.47 2006/07/25 18:27:57 martinea Exp $
*
* tape changer interface program
*/
#include "version.h"
/* local functions */
-void usage P((void));
-int main P((int argc, char **argv));
-void reset_changer P((int argc, char **argv));
-void eject_tape P((int argc, char **argv));
-void clean_tape P((int argc, char **argv));
-void load_slot P((int argc, char **argv));
-void load_label P((int argc, char **argv));
-void show_slots P((int argc, char **argv));
-void show_current P((int argc, char **argv));
-void amtape_taper_scan P((int argc, char **argv));
-void show_device P((int argc, char **argv));
-int loadlabel_slot P((void *ud, int rc, char *slotstr, char *device));
-int show_init P((void *ud, int rc, int ns, int bk, int s));
-int show_init_all P((void *ud, int rc, int ns, int bk, int s));
-int show_init_current P((void *ud, int rc, int ns, int bk, int s));
-int show_slot P((void *ud, int rc, char *slotstr, char *device));
+void usage(void);
+int main(int argc, char **argv);
+void reset_changer(int argc, char **argv);
+void eject_tape(int argc, char **argv);
+void clean_tape(int argc, char **argv);
+void load_slot(int argc, char **argv);
+void load_label(int argc, char **argv);
+void show_slots(int argc, char **argv);
+void show_current(int argc, char **argv);
+void update_labeldb (int argc, char **argv);
+void amtape_taper_scan(int argc, char **argv);
+void show_device(int argc, char **argv);
+int update_one_slot (void *ud, int rc, char *slotstr, char *device);
+int loadlabel_slot(void *ud, int rc, char *slotstr, char *device);
+int show_init(void *ud, int rc, int ns, int bk, int s);
+int show_init_all(void *ud, int rc, int ns, int bk, int s);
+int show_init_current(void *ud, int rc, int ns, int bk, int s);
+int show_slot(void *ud, int rc, char *slotstr, char *device);
static const struct {
const char *name;
- void (*fn) P((int, char **));
+ void (*fn)(int, char **);
const char *usage;
} cmdtab[] = {
{ "reset", reset_changer,
"taper perform taper's scan alg." },
{ "device", show_device,
"device show current tape device" },
+ { "update", update_labeldb,
+ "update update the label matchingdatabase"},
};
-#define NCMDS (sizeof(cmdtab) / sizeof(cmdtab[0]))
+#define NCMDS (int)(sizeof(cmdtab) / sizeof(cmdtab[0]))
-void usage()
+void
+usage(void)
{
int i;
- fprintf(stderr, "Usage: amtape%s <conf> <command>\n", versionsuffix());
+ fprintf(stderr, "Usage: amtape%s <conf> <command> {<args>} [-o configoption]*\n", versionsuffix());
fprintf(stderr, "\tValid commands are:\n");
for (i = 0; i < NCMDS; i++)
fprintf(stderr, "\t\t%s\n", cmdtab[i].usage);
exit(1);
}
-int main(argc, argv)
-int argc;
-char **argv;
+int
+main(
+ int argc,
+ char ** argv)
{
char *conffile;
char *conf_tapelist;
uid_t uid_dumpuser;
char *dumpuser;
struct passwd *pw;
+ int new_argc;
+ char **new_argv;
safe_fd(-1, 0);
safe_cd();
/* Don't die when child closes pipe */
signal(SIGPIPE, SIG_IGN);
+ dbopen(DBG_SUBDIR_SERVER);
+
malloc_size_1 = malloc_inuse(&malloc_hist_1);
erroutput_type = ERR_INTERACTIVE;
- if(argc < 3) usage();
+ parse_conf(argc, argv, &new_argc, &new_argv);
+ if(new_argc < 3) usage();
- config_name = argv[1];
+ config_name = new_argv[1];
config_dir = vstralloc(CONFIG_DIR, "/", config_name, "/", NULL);
conffile = stralloc2(config_dir, CONFFILE_NAME);
if (read_conffile(conffile)) {
error("errors processing config file \"%s\"", conffile);
+ /*NOTREACHED*/
}
+ dbrename(config_name, DBG_SUBDIR_SERVER);
+
conf_tapelist = getconf_str(CNF_TAPELIST);
if (*conf_tapelist == '/') {
conf_tapelist = stralloc(conf_tapelist);
}
if (read_tapelist(conf_tapelist)) {
error("could not load tapelist \"%s\"", conf_tapelist);
+ /*NOTREACHED*/
}
amfree(conf_tapelist);
if ((pw = getpwnam(dumpuser)) == NULL) {
error("cannot look up dump user \"%s\"", dumpuser);
- /* NOTREACHED */
+ /*NOTREACHED*/
}
uid_dumpuser = pw->pw_uid;
if ((pw = getpwuid(uid_me)) == NULL) {
error("cannot look up my own uid %ld", (long)uid_me);
- /* NOTREACHED */
+ /*NOTREACHED*/
}
if (uid_me != uid_dumpuser) {
error("running as user \"%s\" instead of \"%s\"",
pw->pw_name, dumpuser);
- /* NOTREACHED */
+ /*NOTREACHED*/
}
if((have_changer = changer_init()) == 0) {
error("no tpchanger specified in \"%s\"", conffile);
+ /*NOTREACHED*/
} else if (have_changer != 1) {
error("changer initialization failed: %s", strerror(errno));
+ /*NOTREACHED*/
}
/* switch on command name */
- argc -= 2; argv += 2;
+ new_argc -= 2; new_argv += 2;
for (i = 0; i < NCMDS; i++)
- if (strcmp(argv[0], cmdtab[i].name) == 0) {
- (*cmdtab[i].fn)(argc, argv);
+ if (strcmp(new_argv[0], cmdtab[i].name) == 0) {
+ (*cmdtab[i].fn)(new_argc, new_argv);
break;
}
if (i == NCMDS) {
- fprintf(stderr, "%s: unknown command \"%s\"\n", argv0, argv[0]);
+ fprintf(stderr, "%s: unknown command \"%s\"\n", argv0, new_argv[0]);
usage();
}
malloc_list(fileno(stderr), malloc_hist_1, malloc_hist_2);
}
+ dbclose();
return 0;
}
/* ---------------------------- */
-void reset_changer(argc, argv)
-int argc;
-char **argv;
+void
+reset_changer(
+ int argc,
+ char ** argv)
{
char *slotstr = NULL;
+ (void)argc; /* Quiet unused parameter warning */
+ (void)argv; /* Quiet unused parameter warning */
+
switch(changer_reset(&slotstr)) {
case 0:
fprintf(stderr, "%s: changer is reset, slot %s is loaded.\n",
break;
default:
error("could not reset changer: %s", changer_resultstr);
+ /*NOTREACHED*/
}
amfree(slotstr);
}
/* ---------------------------- */
-void clean_tape(argc, argv)
-int argc;
-char **argv;
+void
+clean_tape(
+ int argc,
+ char ** argv)
{
char *devstr = NULL;
+ (void)argc; /* Quiet unused parameter warning */
+ (void)argv; /* Quiet unused parameter warning */
+
if(changer_clean(&devstr) == 0) {
fprintf(stderr, "%s: device %s is clean.\n", get_pname(), devstr);
} else {
/* ---------------------------- */
-void eject_tape(argc, argv)
-int argc;
-char **argv;
+void
+eject_tape(
+ int argc,
+ char ** argv)
{
char *slotstr = NULL;
+ (void)argc; /* Quiet unused parameter warning */
+ (void)argv; /* Quiet unused parameter warning */
+
if(changer_eject(&slotstr) == 0) {
fprintf(stderr, "%s: slot %s is ejected.\n", get_pname(), slotstr);
} else {
/* ---------------------------- */
-void load_slot(argc, argv)
-int argc;
-char **argv;
+void
+load_slot(
+ int argc,
+ char ** argv)
{
char *slotstr = NULL, *devicename = NULL;
char *errstr;
is_advance = (strcmp(argv[1], "advance") == 0);
if(changer_loadslot(argv[1], &slotstr, &devicename)) {
error("could not load slot %s: %s", slotstr, changer_resultstr);
+ /*NOTREACHED*/
}
if(! is_advance && (errstr = tape_rewind(devicename)) != NULL) {
fprintf(stderr,
char *label = NULL, *first_match_label = NULL, *first_match = NULL;
char *searchlabel, *labelstr;
tape_t *tp;
+static int scan_init(void *ud, int rc, int ns, int bk, int s);
static int
-scan_init(ud, rc, ns, bk, s)
- void *ud;
- int rc, ns, bk, s;
+scan_init(
+ void * ud,
+ int rc,
+ int ns,
+ int bk,
+ int s)
{
- if(rc)
+ (void)ud; /* Quiet unused parameter warning */
+ (void)s; /* Quiet unused parameter warning */
+
+ if(rc) {
error("could not get changer info: %s", changer_resultstr);
+ /*NOTREACHED*/
+ }
nslots = ns;
backwards = bk;
return 0;
}
-int loadlabel_slot(ud, rc, slotstr, device)
- void *ud;
-int rc;
-char *slotstr;
-char *device;
+int
+loadlabel_slot(
+ void * ud,
+ int rc,
+ char * slotstr,
+ char * device)
{
char *errstr;
- if(rc > 1)
+ (void)ud; /* Quiet unused parameter warning */
+
+ if(rc > 1) {
error("could not load slot %s: %s", slotstr, changer_resultstr);
+ /*NOTREACHED*/
+ }
else if(rc == 1)
fprintf(stderr, "%s: slot %s: %s\n",
get_pname(), slotstr, changer_resultstr);
return 0;
}
-void load_label(argc, argv)
-int argc;
-char **argv;
+void
+load_label(
+ int argc,
+ char ** argv)
{
if(argc != 2)
usage();
/* ---------------------------- */
-int show_init(ud, rc, ns, bk, s)
- void *ud;
-int rc, ns, bk, s;
+int
+show_init(
+ void * ud,
+ int rc,
+ int ns,
+ int bk,
+ int s)
{
- if(rc)
+ (void)ud; /* Quiet unused parameter warning */
+ (void)s; /* Quiet unused parameter warning */
+
+ if(rc) {
error("could not get changer info: %s", changer_resultstr);
+ /*NOTREACHED*/
+ }
nslots = ns;
backwards = bk;
return 0;
}
-int show_init_all(ud, rc, ns, bk, s)
- void *ud;
-int rc, ns, bk, s;
+int
+show_init_all(
+ void * ud,
+ int rc,
+ int ns,
+ int bk,
+ int s)
{
int ret = show_init(NULL, rc, ns, bk, s);
+
+ (void)ud; /* Quiet unused parameter warning */
+
fprintf(stderr, "%s: scanning all %d slots in tape-changer rack:\n",
get_pname(), nslots);
return ret;
}
-int show_init_current(ud, rc, ns, bk, s)
- void *ud;
-int rc, ns, bk, s;
+int
+show_init_current(
+ void * ud,
+ int rc,
+ int ns,
+ int bk,
+ int s)
{
int ret = show_init(NULL, rc, ns, bk, s);
+
+ (void)ud; /* Quiet unused parameter warning */
+
fprintf(stderr, "%s: scanning current slot in tape-changer rack:\n",
get_pname());
return ret;
}
-int show_slot(ud, rc, slotstr, device)
- void *ud;
-int rc;
-char *slotstr, *device;
+int
+show_slot(
+ void * ud,
+ int rc,
+ char * slotstr,
+ char * device)
{
char *errstr;
- if(rc > 1)
+ (void)ud; /* Quiet unused parameter warning */
+
+ if(rc > 1) {
error("could not load slot %s: %s", slotstr, changer_resultstr);
- else if(rc == 1)
+ /*NOTREACHED*/
+ }
+ else if(rc == 1) {
fprintf(stderr, "slot %s: %s\n", slotstr, changer_resultstr);
- else if((errstr = tape_rdlabel(device, &datestamp, &label)) != NULL)
+ }
+ else if((errstr = tape_rdlabel(device, &datestamp, &label)) != NULL) {
fprintf(stderr, "slot %s: %s\n", slotstr, errstr);
- else {
+ amfree(errstr);
+ } else {
fprintf(stderr, "slot %s: date %-8s label %s\n",
slotstr, datestamp, label);
}
return 0;
}
-void show_current(argc, argv)
-int argc;
-char **argv;
+void
+show_current(
+ int argc,
+ char ** argv)
{
+ (void)argv; /* Quiet unused parameter warning */
+
if(argc != 1)
usage();
changer_current(NULL, show_init_current, show_slot);
}
-void show_slots(argc, argv)
-int argc;
-char **argv;
+void
+show_slots(
+ int argc,
+ char ** argv)
{
+ (void)argv; /* Quiet unused parameter warning */
+
if(argc != 1)
usage();
/* ---------------------------- */
-void amtape_taper_scan(argc, argv)
-int argc;
-char **argv;
+
+void
+amtape_taper_scan(
+ int argc,
+ char ** argv)
{
char *device = NULL;
- char *label = NULL, *errmsg = NULL;
+ char *label = NULL;
+
+ (void)argc; /* Quiet unused parameter warning */
+ (void)argv; /* Quiet unused parameter warning */
if((tp = lookup_last_reusable_tape(0)) == NULL)
searchlabel = NULL;
if(searchlabel) fprintf(stderr, "tape label %s or ", searchlabel);
fprintf(stderr, "a new tape.\n");
- if (taper_scan(searchlabel, &label, &datestamp, &errmsg, &device) <= 0) {
- fprintf(stderr, "%s\n", errmsg);
- }
+ taper_scan(searchlabel, &label, &datestamp,&device, FILE_taperscan_output_callback, stderr);
fprintf(stderr, "%s: label %s is now loaded.\n",
get_pname(), label);
amfree(label);
amfree(datestamp);
- amfree(errmsg);
amfree(device);
}
/* ---------------------------- */
-void show_device(argc, argv)
-int argc;
-char **argv;
+void
+show_device(
+ int argc,
+ char ** argv)
{
char *slot = NULL, *device = NULL;
- if(changer_loadslot("current", &slot, &device))
+ (void)argc; /* Quiet unused parameter warning */
+ (void)argv; /* Quiet unused parameter warning */
+
+ if(changer_loadslot("current", &slot, &device)) {
error("Could not load current slot.\n");
+ /*NOTREACHED*/
+ }
printf("%s\n", device);
amfree(slot);
amfree(device);
}
+
+/* ---------------------------- */
+
+int
+update_one_slot(
+ void * ud,
+ int rc,
+ char * slotstr,
+ char * device)
+{
+ char *errstr = NULL;
+ char *datestamp = NULL;
+ char *label = NULL;
+
+ (void)ud; /* Quiet unused parameter warning */
+
+ if(rc > 1)
+ error("could not load slot %s: %s", slotstr, changer_resultstr);
+ else if(rc == 1)
+ fprintf(stderr, "slot %s: %s\n", slotstr, changer_resultstr);
+ else if((errstr = tape_rdlabel(device, &datestamp, &label)) != NULL)
+ fprintf(stderr, "slot %s: %s\n", slotstr, errstr);
+ else {
+ fprintf(stderr, "slot %s: date %-8s label %s\n",
+ slotstr, datestamp, label);
+ changer_label(slotstr, label);
+ }
+ amfree(errstr);
+ amfree(datestamp);
+ amfree(label);
+ return 0;
+}
+
+void
+update_labeldb(
+ int argc,
+ char ** argv)
+{
+ (void)argv; /* Quiet unused parameter warning */
+
+ if(argc != 1)
+ usage();
+
+ changer_find(NULL, show_init_all, update_one_slot, NULL);
+}