+ if (!!delete_before + delete_during + delete_after > 1) {
+ snprintf(err_buf, sizeof err_buf,
+ "You may not combine multiple --delete-WHEN options.\n");
+ return 0;
+ }
+ if (!recurse) {
+ delete_before = delete_during = delete_after = 0;
+ delete_mode = delete_excluded = 0;
+ } else if (delete_before || delete_during || delete_after)
+ delete_mode = 1;
+ else if (delete_mode || delete_excluded) {
+ if (refused_delete_before) {
+ create_refuse_error(refused_delete_before);
+ return 0;
+ }
+ delete_mode = delete_before = 1;
+ }
+
+ if (delete_mode && refused_delete) {
+ create_refuse_error(refused_delete);
+ return 0;
+ }
+
+ if (remove_sent_files) {
+ /* We only want to infer this refusal of --remove-sent-files
+ * via the refusal of "delete", not any of the "delete-FOO"
+ * options. */
+ if (refused_delete && am_sender) {
+ create_refuse_error(refused_delete);
+ return 0;
+ }
+ need_messages_from_generator = 1;
+ }
+
+ *argv = poptGetArgs(pc);
+ *argc = count_args(*argv);
+
+ if (sanitize_paths) {
+ int i;
+ for (i = *argc; i-- > 0; )
+ (*argv)[i] = sanitize_path(NULL, (*argv)[i], "", 0);
+ if (tmpdir)
+ tmpdir = sanitize_path(NULL, tmpdir, NULL, 0);
+ if (partial_dir)
+ partial_dir = sanitize_path(NULL, partial_dir, NULL, 0);
+ if (backup_dir)
+ backup_dir = sanitize_path(NULL, backup_dir, NULL, 0);
+ if (files_from)
+ files_from = sanitize_path(NULL, files_from, NULL, 0);
+ }
+ if (server_filter_list.head && !am_sender) {
+ struct filter_list_struct *elp = &server_filter_list;
+ int i;
+ if (tmpdir) {
+ if (!*tmpdir)
+ goto options_rejected;
+ clean_fname(tmpdir, 1);
+ if (check_filter(elp, tmpdir, 1) < 0)
+ goto options_rejected;
+ }
+ if (partial_dir && *partial_dir) {
+ clean_fname(partial_dir, 1);
+ if (check_filter(elp, partial_dir, 1) < 0)
+ goto options_rejected;
+ }
+ for (i = 0; i < basis_dir_cnt; i++) {
+ if (!*basis_dir[i])
+ goto options_rejected;
+ clean_fname(basis_dir[i], 1);
+ if (check_filter(elp, basis_dir[i], 1) < 0)
+ goto options_rejected;
+ }
+ if (backup_dir) {
+ if (!*backup_dir)
+ goto options_rejected;
+ clean_fname(backup_dir, 1);
+ if (check_filter(elp, backup_dir, 1) < 0)
+ goto options_rejected;
+ }
+ }
+ if (server_filter_list.head && files_from) {
+ if (!*files_from)
+ goto options_rejected;
+ clean_fname(files_from, 1);
+ if (check_filter(&server_filter_list, files_from, 0) < 0) {
+ options_rejected:
+ snprintf(err_buf, sizeof err_buf,
+ "Your options have been rejected by the server.\n");
+ return 0;
+ }
+ }
+