+ char *kw[] = {
+ "jobid", /* 0 */
+ "current", /* 1 */
+ "before", /* 2 */
+ "file", /* 3 */
+ "select", /* 4 */
+ "pool", /* 5 */
+ "all", /* 6 */
+ "client", /* 7 */
+ "storage", /* 8 */
+ "fileset", /* 9 */
+ "where", /* 10 */
+ "yes", /* 11 */
+ "done", /* 12 */
+ NULL
+ };
+
+ *rx->JobIds = 0;
+
+ for (i=1; i<ua->argc; i++) { /* loop through arguments */
+ bool found_kw = false;
+ for (j=0; kw[j]; j++) { /* loop through keywords */
+ if (strcasecmp(kw[j], ua->argk[i]) == 0) {
+ found_kw = true;
+ break;
+ }
+ }
+ if (!found_kw) {
+ bsendmsg(ua, _("Unknown keyword: %s\n"), ua->argk[i]);
+ return 0;
+ }
+ /* Found keyword in kw[] list, process it */
+ switch (j) {
+ case 0: /* jobid */
+ if (*rx->JobIds != 0) {
+ pm_strcat(&rx->JobIds, ",");
+ }
+ pm_strcat(&rx->JobIds, ua->argv[i]);
+ done = true;
+ break;
+ case 1: /* current */
+ bstrutime(date, sizeof(date), time(NULL));
+ have_date = true;
+ break;
+ case 2: /* before */
+ if (str_to_utime(ua->argv[i]) == 0) {
+ bsendmsg(ua, _("Improper date format: %s\n"), ua->argv[i]);
+ return 0;
+ }
+ bstrncpy(date, ua->argv[i], sizeof(date));
+ have_date = true;
+ break;
+ case 3: /* file */
+ if (!have_date) {
+ bstrutime(date, sizeof(date), time(NULL));
+ }
+ if (!get_client_name(ua, rx)) {
+ return 0;
+ }
+ pm_strcpy(&ua->cmd, ua->argv[i]);
+ insert_one_file(ua, rx, date);
+ if (rx->name_list.num_ids) {
+ /* Check MediaType and select storage that corresponds */
+ get_storage_from_mediatype(ua, &rx->name_list, rx);
+ done = true;
+ }
+ break;
+ case 4: /* select */
+ if (!have_date) {
+ bstrutime(date, sizeof(date), time(NULL));
+ }
+ if (!select_backups_before_date(ua, rx, date)) {
+ return 0;
+ }
+ done = true;
+ break;
+ case 5: /* pool specified */
+ rx->pool = (POOL *)GetResWithName(R_POOL, ua->argv[i]);
+ if (!rx->pool) {
+ bsendmsg(ua, _("Error: Pool resource \"%s\" does not exist.\n"), ua->argv[i]);
+ return 0;
+ }
+ if (!acl_access_ok(ua, Pool_ACL, ua->argv[i])) {
+ rx->pool = NULL;
+ bsendmsg(ua, _("Error: Pool resource \"%s\" access not allowed.\n"), ua->argv[i]);
+ return 0;
+ }
+ break;
+ case 6: /* all specified */
+ rx->all = true;
+ break;
+ /*
+ * All keywords 7 or greater are ignored or handled by a select prompt
+ */
+ default:
+ break;
+ }
+ }
+ if (rx->name_list.num_ids) {
+ return 2; /* filename list made */
+ }
+
+ if (!done) {
+ bsendmsg(ua, _("\nFirst you select one or more JobIds that contain files\n"