* file named AUTHORS, in the root directory of this distribution.
*/
/*
- * $Id: amlabel.c,v 1.18.2.15.4.3.2.4.2.4 2005/10/02 13:48:42 martinea Exp $
+ * $Id: amlabel.c,v 1.53.2.2 2007/02/06 14:07:44 martinea Exp $
*
* write an Amanda label on a tape
*/
/* local functions */
-void usage P((char *argv0));
+int main(int argc, char **argv);
+void usage(void);
-void usage(argv0)
-char *argv0;
+void
+usage(void)
{
- fprintf(stderr, "Usage: %s [-f] <conf> <label> [slot <slot-number>]\n",
- argv0);
+ fprintf(stderr, "Usage: %s [-f] <conf> <label> [slot <slot-number>] [-o configoption]*\n",
+ get_pname());
exit(1);
}
-int main(argc, argv)
- int argc;
- char **argv;
+int
+main(
+ int argc,
+ char ** argv)
{
char *conffile;
char *conf_tapelist;
#endif /* HAVE_LINUX_ZFTAPE_H */
int have_changer;
int force, tape_ok;
- tape_t *tp;
tapetype_t *tape;
- long tt_blocksize_kb;
+ size_t tt_blocksize_kb;
int slotcommand;
uid_t uid_me;
uid_t uid_dumpuser;
char *dumpuser;
struct passwd *pw;
+ int new_argc;
+ char **new_argv;
#ifdef HAVE_LIBVTBLC
int vtbl_no = -1;
safe_cd();
set_pname("amlabel");
- dbopen();
+
+ dbopen(DBG_SUBDIR_SERVER);
+
+ /* Don't die when child closes pipe */
+ signal(SIGPIPE, SIG_IGN);
malloc_size_1 = malloc_inuse(&malloc_hist_1);
erroutput_type = ERR_INTERACTIVE;
- if(argc > 1 && strcmp(argv[1],"-f") == 0)
+ parse_server_conf(argc, argv, &new_argc, &new_argv);
+
+ if(new_argc > 1 && strcmp(new_argv[1],"-f") == 0)
force=1;
else force=0;
- if(argc != 3+force && argc != 5+force)
- usage(argv[0]);
+ if(new_argc != 3+force && new_argc != 5+force)
+ usage();
- config_name = argv[1+force];
- label = argv[2+force];
+ config_name = new_argv[1+force];
+ label = new_argv[2+force];
- if(argc == 5+force) {
- if(strcmp(argv[3+force], "slot"))
- usage(argv[0]);
- slotstr = argv[4+force];
+ if(new_argc == 5+force) {
+ if(strcmp(new_argv[3+force], "slot"))
+ usage();
+ slotstr = new_argv[4+force];
slotcommand = 1;
} else {
slotstr = "current";
conffile = stralloc2(config_dir, CONFFILE_NAME);
if (read_conffile(conffile)) {
error("errors processing config file \"%s\"", conffile);
+ /*NOTREACHED*/
}
+
+ dbrename(config_name, DBG_SUBDIR_SERVER);
+
+ report_bad_conf_arg();
+
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*/
}
uid_me = getuid();
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*/
}
labelstr = getconf_str(CNF_LABELSTR);
- if(!match(labelstr, label))
+ if(!match(labelstr, label)) {
error("label %s doesn't match labelstr \"%s\"", label, labelstr);
+ /*NOTREACHED*/
+ }
- if((tp = lookup_tapelabel(label))!=NULL) {
- if(!force)
+ if((lookup_tapelabel(label))!=NULL) {
+ if(!force) {
error("label %s already on a tape\n",label);
+ /*NOTREACHED*/
+ }
}
tape = lookup_tapetype(getconf_str(CNF_TAPETYPE));
- tt_blocksize_kb = tape->blocksize;
+ tt_blocksize_kb = (size_t)tapetype_get_blocksize(tape);
if((have_changer = changer_init()) == 0) {
if(slotcommand) {
fprintf(stderr,
"%s: no tpchanger specified in \"%s\", so slot command invalid\n",
- argv[0], conffile);
- usage(argv[0]);
+ new_argv[0], conffile);
+ usage();
+ }
+ tapename = getconf_str(CNF_TAPEDEV);
+ if (tapename == NULL) {
+ error("No tapedev specified");
+ } else {
+ tapename = stralloc(tapename);
}
- tapename = stralloc(getconf_str(CNF_TAPEDEV));
#ifdef HAVE_LIBVTBLC
rawtapedev = stralloc(getconf_str(CNF_RAWTAPEDEV));
#endif /* HAVE_LIBVTBLC */
} else if(have_changer != 1) {
error("changer initialization failed: %s", strerror(errno));
+ /*NOTREACHED*/
} else {
if(changer_loadslot(slotstr, &outslot, &tapename)) {
error("could not load slot \"%s\": %s", slotstr, changer_resultstr);
+ /*NOTREACHED*/
}
printf("labeling tape in slot %s (%s):\n", outslot, tapename);
(errno == EACCES) ? "tape is write-protected"
: strerror(errno));
error(errstr);
+ /*NOTREACHED*/
}
}
#endif /* HAVE_LINUX_ZFTAPE_H */
if(tapefd_rewind(fd) == -1) {
putchar('\n');
error(strerror(errno));
+ /*NOTREACHED*/
}
}
else
if((errstr = tape_rewind(tapename)) != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
tape_ok=1;
tape_ok=0;
}
else {
- if((tp = lookup_tapelabel(oldlabel)) != NULL) {
+ if((lookup_tapelabel(oldlabel)) != NULL) {
printf(", tape is active");
if(!force)
tape_ok=0;
if(tapefd_rewind(fd) == -1) {
putchar('\n');
error(strerror(errno));
+ /*NOTREACHED*/
}
}
else
if((errstr = tape_rewind(tapename)) != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
if(tape_ok) {
#ifdef HAVE_LINUX_ZFTAPE_H
if (isa_zftape) {
- errstr = tapefd_wrlabel(fd, "X", label, tt_blocksize_kb * 1024);
+ errstr = tapefd_wrlabel(fd, "X", label,
+ (tt_blocksize_kb * 1024));
if(errstr != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
}
else
#endif /* HAVE_LINUX_ZFTAPE_H */
- errstr = tape_wrlabel(tapename, "X", label, tt_blocksize_kb * 1024);
+ errstr = tape_wrlabel(tapename, "X", label,
+ (tt_blocksize_kb * 1024));
if(errstr != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
#ifdef HAVE_LINUX_ZFTAPE_H
if (isa_zftape) {
- tapefd_weof(fd, 1);
+ tapefd_weof(fd, (off_t)1);
}
#endif /* HAVE_LINUX_ZFTAPE_H */
#ifdef HAVE_LINUX_ZFTAPE_H
if (isa_zftape) {
- errstr = tapefd_wrendmark(fd, "X", tt_blocksize_kb * 1024);
+ errstr = tapefd_wrendmark(fd, "X",
+ (tt_blocksize_kb * 1024));
if(errstr != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
}
else
#endif /* HAVE_LINUX_ZFTAPE_H */
- errstr = tape_wrendmark(tapename, "X", tt_blocksize_kb * 1024);
+ errstr = tape_wrendmark(tapename, "X",
+ (tt_blocksize_kb * 1024));
if(errstr != NULL) {
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
#ifdef HAVE_LINUX_ZFTAPE_H
if (isa_zftape) {
- tapefd_weof(fd, 1);
+ tapefd_weof(fd, (off_t)1);
printf(",\nrewinding"); fflush(stdout);
if(tapefd_rewind(fd) == -1) {
putchar('\n');
error(strerror(errno));
+ /*NOTREACHED*/
}
close(fd);
#ifdef HAVE_LIBVTBLC
}
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
/* read volume table */
if ((num_volumes = read_vtbl(fd, volumes, vtbl_buffer,
"reading volume table: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
/* set date and volume label for first entry */
vtbl_no = 0;
"setting date for entry 1: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
if(set_label(label, volumes, num_volumes, vtbl_no)){
errstr = newstralloc2(errstr,
"setting label for entry 1: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
/* set date and volume label for last entry */
vtbl_no = 1;
"setting date for entry 2: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
if(set_label("AMANDA Tape End", volumes, num_volumes, vtbl_no)){
errstr = newstralloc2(errstr,
"setting label for entry 2: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
/* write volume table back */
if (write_vtbl(fd, volumes, vtbl_buffer, num_volumes, first_seg,
"writing volume table: ", strerror(errno));
putchar('\n');
error(errstr);
+ /*NOTREACHED*/
}
close(fd);
#endif /* HAVE_LIBVTBLC */
if((errstr = tape_rdlabel(tapename, &olddatestamp, &oldlabel)) != NULL) {
putchar('\n');
- if (strcmp(errstr, "not an amanda tape") != 0)
+ if (strcmp(errstr, "not an amanda tape") != 0) {
error(errstr);
+ /*NOTREACHED*/
+ }
error("no label found, are you sure %s is non-rewinding?",
tapename);
+ /*NOTREACHED*/
}
if (strcmp("X", olddatestamp) != 0 ||
putchar('\n');
error("read label %s back, timestamp %s (expected X), what now?",
oldlabel, olddatestamp);
+ /*NOTREACHED*/
}
amfree(oldlabel);
amfree(olddatestamp);
conf_tapelist_old = stralloc2(conf_tapelist, ".amlabel");
if(write_tapelist(conf_tapelist_old)) {
error("couldn't write tapelist: %s", strerror(errno));
+ /*NOTREACHED*/
}
amfree(conf_tapelist_old);
/* XXX add cur_tape number to tape list structure */
remove_tapelabel(label);
- add_tapelabel(0, label);
+ add_tapelabel("0", label);
if(write_tapelist(conf_tapelist)) {
error("couldn't write tapelist: %s", strerror(errno));
+ /*NOTREACHED*/
}
- } /* write tape list */
- if(have_changer) {
- /* Now we try to inform the changer, about the new label */
- changer_label(outslot,label);
- }
+ if (have_changer) {
+ changer_label(outslot, label);
+ }
+ } /* write tape list */
printf(", done.\n");
} else {
printf("\ntape not labeled\n");
}
+ clear_tapelist();
+ free_new_argv(new_argc, new_argv);
+ free_server_config();
amfree(outslot);
amfree(tapename);
amfree(conffile);
amfree(conf_tapelist);
amfree(config_dir);
config_name=NULL;
+ dbclose();
malloc_size_2 = malloc_inuse(&malloc_hist_2);
malloc_list(fileno(stderr), malloc_hist_1, malloc_hist_2);
}
- dbclose();
return 0;
}