DOVEADM_CMD_PARAM('\0', "ignore-arg", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
-
-void doveadm_dsync_main(int *_argc, char **_argv[])
-{
- int argc = *_argc;
- const char *getopt_str;
- char **argv = *_argv;
- char **new_argv, *mailbox = NULL, *alt_char = NULL, *username = NULL;
- char *p, *dup, new_flags[6];
- int max_argc, src, dest, i, j;
- bool flag_f = FALSE, flag_R = FALSE, flag_m, flag_u, flag_C, has_arg;
- bool dsync_server = FALSE;
-
- p = strrchr(argv[0], '/');
- if (p == NULL) p = argv[0];
- if (strstr(p, "dsync") == NULL)
- return;
-
- /* @UNSAFE: this is called when the "doveadm" binary is called as
- "dsync" (for backwards compatibility) */
- max_argc = argc + 7;
- new_argv = t_new(char *, max_argc);
- new_argv[0] = argv[0];
- dest = 1;
- getopt_str = master_service_getopt_string();
-
- /* add global doveadm flags */
- for (src = 1; src < argc; src++) {
- if (argv[src][0] != '-')
- break;
-
- flag_m = FALSE; flag_C = FALSE; has_arg = FALSE; flag_u = FALSE;
- dup = t_strdup_noconst(argv[src]);
- for (i = j = 1; argv[src][i] != '\0'; i++) {
- switch (argv[src][i]) {
- case 'C':
- flag_C = TRUE;
- break;
- case 'f':
- flag_f = TRUE;
- break;
- case 'R':
- flag_R = TRUE;
- break;
- case 'm':
- flag_m = TRUE;
- break;
- case 'u':
- flag_u = TRUE;
- break;
- default:
- p = strchr(getopt_str, argv[src][i]);
- if (p != NULL && p[1] == ':')
- has_arg = TRUE;
- dup[j++] = argv[src][i];
- break;
- }
- }
- if (j > 1) {
- dup[j++] = '\0';
- new_argv[dest++] = dup;
- if (has_arg && src+1 < argc)
- new_argv[dest++] = argv[++src];
- }
- if (flag_m) {
- if (src+1 == argc)
- i_fatal("-m missing parameter");
- mailbox = argv[++src];
- }
- if (flag_u) {
- if (src+1 == argc)
- i_fatal("-u missing parameter");
- username = argv[++src];
- }
- if (flag_C) {
- if (src+1 == argc)
- i_fatal("-C missing parameter");
- alt_char = argv[++src];
- }
- }
- if (alt_char != NULL) {
- new_argv[dest++] = "-o";
- new_argv[dest++] =
- p_strconcat(pool_datastack_create(),
- "dsync_alt_char=", alt_char, NULL);
- }
-
- /* mirror|backup|server */
- if (src == argc)
- i_fatal("Missing mirror or backup parameter");
- if (strcmp(argv[src], "sync") == 0 ||
- strcmp(argv[src], "dsync-server") == 0) {
- /* we're re-executing dsync due to doveconf.
- "backup" re-exec detection is later. */
- return;
- }
- if (strcmp(argv[src], "mirror") == 0)
- new_argv[dest] = "sync";
- else if (strcmp(argv[src], "backup") == 0)
- new_argv[dest] = "backup";
- else if (strcmp(argv[src], "server") == 0) {
- new_argv[dest] = "dsync-server";
- dsync_server = TRUE;
- } else
- i_fatal("Invalid parameter: %s", argv[src]);
- src++; dest++;
-
- if (src < argc && str_begins_with(argv[src], "-E")) {
- /* we're re-executing dsync due to doveconf */
- return;
- }
-
- /* dsync flags */
- new_flags[0] = '-';
- new_flags[1] = 'E'; i = 2;
- if (!dsync_server) {
- if (flag_f)
- new_flags[i++] = 'f';
- if (flag_R)
- new_flags[i++] = 'R';
- if (mailbox != NULL)
- new_flags[i++] = 'm';
- }
- i_assert((unsigned int)i < sizeof(new_flags));
- new_flags[i] = '\0';
-
- if (i > 1) {
- new_argv[dest++] = strdup(new_flags);
- if (mailbox != NULL)
- new_argv[dest++] = mailbox;
- }
- if (username != NULL) {
- new_argv[dest++] = "-u";
- new_argv[dest++] = username;
- }
-
- /* rest of the parameters */
- for (; src < argc; src++)
- new_argv[dest++] = argv[src];
- i_assert(dest < max_argc);
- new_argv[dest] = NULL;
-
- legacy_dsync = TRUE;
- *_argc = dest;
- *_argv = new_argv;
- i_getopt_reset();
-}