Kern's ToDo List
- 14 May 2003
+ 19 May 2003
Documentation to do: (any release a little bit at a time)
- Document running a test version.
For 1.31 release:
- Document what characters can go into Volume names.
-- Implement Volume name checking.
- Default duration with no qualifier is sec should be 1 day
- Getting the following on all directories on Win32
19-May-2003 01:14 tibs-fd: Could not access c:/cygwin/home/kern/rxvt: ERR=Permission denied
- When the FD errs (e.g. disk full) have a more graceful shutdown.
- Make sure Bacula prunes/purges canceled and failed jobs too and all
jobs with zero JobFiles.
+- Implement Volume name checking.
Dmsg3(400, "Update media %s oldStat=%s newStat=%s\n", sdmr.VolumeName,
mr.VolStatus, sdmr.VolStatus);
bstrncpy(mr.VolumeName, sdmr.VolumeName, sizeof(mr.VolumeName)); /* copy Volume name */
+ unbash_spaces(mr.VolumeName);
if (!db_get_media_record(jcr, jcr->db, &mr)) {
Jmsg(jcr, M_ERROR, 0, _("Unable to get Media record for Volume %s: ERR=%s\n"),
mr.VolumeName, db_strerror(jcr->db));
mr->LabelDate = time(NULL);
bstrncpy(mr->MediaType, jcr->store->media_type, sizeof(mr->MediaType));
bstrncpy(name, pr.LabelFormat, sizeof(name));
- if (strchr(name, (int)'%') != NULL) {
+ if (!is_volume_name_legal(NULL, name)) {
Jmsg(jcr, M_ERROR, 0, _("Illegal character in Label Format\n"));
goto bail_out;
}
/* fd_cmds.c */
extern int connect_to_file_daemon(JCR *jcr, int retry_interval,
- int max_retry_time, int verbose);
+ int max_retry_time, int verbose);
extern int send_include_list(JCR *jcr);
extern int send_exclude_list(JCR *jcr);
extern int get_attributes_and_put_in_catalog(JCR *jcr);
extern int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId);
extern int put_file_into_catalog(JCR *jcr, long file_index, char *fname,
- char *link, char *attr, int stream);
+ char *link, char *attr, int stream);
/* job.c */
extern void set_jcr_defaults(JCR *jcr, JOB *job);
/* msgchan.c */
extern int connect_to_storage_daemon(JCR *jcr, int retry_interval,
- int max_retry_time, int verbose);
+ int max_retry_time, int verbose);
extern int start_storage_daemon_job(JCR *jcr);
extern int start_storage_daemon_message_thread(JCR *jcr);
extern int bget_dirmsg(BSOCK *bs);
int get_yesno(UAContext *ua, char *prompt);
void parse_ua_args(UAContext *ua);
+/* ua_label.c */
+int is_volume_name_legal(UAContext *ua, char *name);
+
/* ua_output.c */
void prtit(void *ctx, char *msg);
void bsendmsg(void *sock, char *fmt, ...);
/* ua_select.c */
-STORE *select_storage_resource(UAContext *ua);
-JOB *select_job_resource(UAContext *ua);
-JOB *select_restore_job_resource(UAContext *ua);
-CLIENT *select_client_resource(UAContext *ua);
+STORE *select_storage_resource(UAContext *ua);
+JOB *select_job_resource(UAContext *ua);
+JOB *select_restore_job_resource(UAContext *ua);
+CLIENT *select_client_resource(UAContext *ua);
FILESET *select_fileset_resource(UAContext *ua);
-int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr);
-int select_media_dbr(UAContext *ua, MEDIA_DBR *mr);
-int select_pool_dbr(UAContext *ua, POOL_DBR *pr);
-int select_client_dbr(UAContext *ua, CLIENT_DBR *cr);
-
-void start_prompt(UAContext *ua, char *msg);
-void add_prompt(UAContext *ua, char *prompt);
-int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt);
-CAT *get_catalog_resource(UAContext *ua);
+int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr);
+int select_media_dbr(UAContext *ua, MEDIA_DBR *mr);
+int select_pool_dbr(UAContext *ua, POOL_DBR *pr);
+int select_client_dbr(UAContext *ua, CLIENT_DBR *cr);
+
+void start_prompt(UAContext *ua, char *msg);
+void add_prompt(UAContext *ua, char *prompt);
+int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt);
+CAT *get_catalog_resource(UAContext *ua);
STORE *get_storage_resource(UAContext *ua, int use_default);
-int get_media_type(UAContext *ua, char *MediaType, int max_media);
-int get_pool_dbr(UAContext *ua, POOL_DBR *pr);
-int get_client_dbr(UAContext *ua, CLIENT_DBR *cr);
+int get_media_type(UAContext *ua, char *MediaType, int max_media);
+int get_pool_dbr(UAContext *ua, POOL_DBR *pr);
+int get_client_dbr(UAContext *ua, CLIENT_DBR *cr);
POOL *get_pool_resource(UAContext *ua);
POOL *select_pool_resource(UAContext *ua);
CLIENT *get_client_resource(UAContext *ua);
-int get_job_dbr(UAContext *ua, JOB_DBR *jr);
+int get_job_dbr(UAContext *ua, JOB_DBR *jr);
int find_arg_keyword(UAContext *ua, char **list);
int find_arg(UAContext *ua, char *keyword);
}
}
/* Don't allow | in Volume name because it is the volume separator character */
- if (strchr(ua->cmd, '|')) {
- bsendmsg(ua, _("Illegal character | in a volume name.\n"));
+ if (!is_volume_name_legal(ua, ua->cmd)) {
goto getVolName;
}
if (strlen(ua->cmd) >= MAX_NAME_LENGTH-10) {
/* Forward referenced functions */
static int do_label(UAContext *ua, char *cmd, int relabel);
static void label_from_barcodes(UAContext *ua);
-static int is_legal_volume_name(UAContext *ua, char *name);
static int send_label_request(UAContext *ua, MEDIA_DBR *mr, MEDIA_DBR *omr,
POOL_DBR *pr, int relabel);
static vol_list_t *get_slot_list_from_SD(UAContext *ua);
/* If relabel get name of Volume to relabel */
if (relabel) {
/* Check for volume=OldVolume */
- i = find_arg(ua, "volume");
- if (i >= 0 && ua->argv[i]) {
+ i = find_arg_with_value(ua, "volume");
+ if (i >= 0) {
memset(&omr, 0, sizeof(omr));
bstrncpy(omr.VolumeName, ua->argv[i], sizeof(omr.VolumeName));
if (db_get_media_record(ua->jcr, ua->db, &omr)) {
}
/* Check for name=NewVolume */
- i = find_arg(ua, "name");
- if (i >= 0 && ua->argv[i]) {
+ i = find_arg_with_value(ua, "name");
+ if (i >= 0) {
pm_strcpy(&ua->cmd, ua->argv[i]);
goto checkName;
}
return 1;
}
checkName:
- if (!is_legal_volume_name(ua, ua->cmd)) {
+ if (!is_volume_name_legal(ua, ua->cmd)) {
continue;
}
/* If autochanger, request slot */
if (store->autochanger) {
- i = find_arg(ua, "slot");
- if (i >= 0 && ua->argv[i]) {
+ i = find_arg_with_value(ua, "slot");
+ if (i >= 0) {
mr.Slot = atoi(ua->argv[i]);
} else if (!get_pint(ua, _("Enter slot (0 for none): "))) {
return 1;
return;
}
-static int is_legal_volume_name(UAContext *ua, char *name)
+/*
+ * Check if the Volume name has legal characters
+ * If ua is non-NULL send the message
+ */
+int is_volume_name_legal(UAContext *ua, char *name)
{
int len;
+ char *p;
+ char *accept = ":.-_";
+
/* Restrict the characters permitted in the Volume name */
- if (strpbrk(name, "`~!@#$%^&*()[]{}|\\;'\"<>?,/")) {
- bsendmsg(ua, _("Illegal character | in a volume name.\n"));
+ for (p=name; *p; p++) {
+ if (B_ISALPHA(*p) || B_ISDIGIT(*p) || strchr(accept, (int)(*p))) {
+ continue;
+ }
+ if (ua) {
+ bsendmsg(ua, _("Illegal character \"%c\" in a volume name.\n"), *p);
+ }
return 0;
}
len = strlen(name);
if (len >= MAX_NAME_LENGTH) {
- bsendmsg(ua, _("Volume name too long.\n"));
+ if (ua) {
+ bsendmsg(ua, _("Volume name too long.\n"));
+ }
return 0;
}
if (len == 0) {
- bsendmsg(ua, _("Volume name must be at least one character long.\n"));
+ if (ua) {
+ bsendmsg(ua, _("Volume name must be at least one character long.\n"));
+ }
return 0;
}
return 1;
continue;
}
Slot = atoi(sd->msg);
- if (Slot <= 0 || !is_legal_volume_name(ua, p)) {
+ if (Slot <= 0 || !is_volume_name_legal(ua, p)) {
continue;
}