On 09/10/2016 21:48, Michael Felt wrote:
I finally decided it was really time to stop being lazy and really move away from gmail. After I have a server in my basement using power, etc.
So I turned on the imap provided - and did not quite cry - it will have to do for now, but imap2 is wanting.
Next chapter in packaging.
a) I have 'patched' several files to get around the 'limitation' of the xlc parsing of Compound Literals.
b) a bit more difficult is to figure out how to not need GNU C Library getopt(). Currently stuck at:
xlc_r -DHAVE_CONFIG_H -I. -I../../../src/x071-test/src/doveadm -I../.. -I../../../src/x071-test/src/lib -I../../../src/x071-test/src/lib-test -I../../../src/x071-test/src/lib-settings -I../../../src/x071-test/src/lib-auth -I../../../src/x071-test/src/lib-compression -I../../../src/x071-test/src/lib-dict -I../../../src/x071-test/src/lib-fs -I../../../src/x071-test/src/lib-ssl-iostream -I../../../src/x071-test/src/lib-master -I../../../src/x071-test/src/lib-mail -I../../../src/x071-test/src/lib-imap -I../../../src/x071-test/src/lib-index -I../../../src/x071-test/src/lib-storage -I../../../src/x071-test/src/lib-imap-storage -I../../../src/x071-test/src/lib-http -I../../../src/x071-test/src/lib-dcrypt -I../../../src/x071-test/src/auth -DMODULEDIR=\""/opt/lib/dovecot"\" -DAUTH_MODULE_DIR=\""/opt/lib/dovecot/auth"\" -DDOVEADM_MODULEDIR=\""/opt/lib/dovecot/doveadm"\" -DPKG_RUNDIR=\""/var/x071-test/run/dovecot"\" -DPKG_STATEDIR=\""/var/x071-test/lib/dovecot"\" -DPKG_LIBEXECDIR=\""/opt/libexec/dovecot"\" -DBINDIR=\""/opt/bin"\" -DMANDIR=\""/usr/share/man"\" -I/opt/include -I/opt/include -O2 -qmaxmem=-1 -qarch=pwr5 -c -o doveadm-cmd.o ../../../src/x071-test/src/doveadm/doveadm-cmd.c "../../../src/x071-test/src/doveadm/doveadm-cmd.c", line 434.24: 1506-007 (S) "struct option" is undefined. "../../../src/x071-test/src/doveadm/doveadm-cmd.c", line 516.9: 1506-285 (S) The indirection operator cannot be applied to a pointer to an incomplete struct or union. "../../../src/x071-test/src/doveadm/doveadm-cmd.c", line 536.37: 1506-285 (S) The indirection operator cannot be applied to a pointer to an incomplete struct or union. "../../../src/x071-test/src/doveadm/doveadm-cmd.c", line 548.37: 1506-285 (S) The indirection operator cannot be applied to a pointer to an incomplete struct or union. make[1]: *** [doveadm-cmd.o] Error 1
+428 static void +429 doveadm_build_options(const struct doveadm_cmd_param par[], +430 string_t *shortopts, +431 ARRAY_TYPE(getopt_option_array) *longopts) +432 { +433 for(size_t i=0; par[i].name != NULL; i++) { +434 struct option longopt; +435 +436 i_zero(&longopt); +437 longopt.name = par[i].name; +438 if (par[i].short_opt != '\0') { +439 longopt.val = par[i].short_opt; +440 str_append_c(shortopts, par[i].short_opt); +441 if (par[i].type != CMD_PARAM_BOOL) +442 str_append_c(shortopts, ':'); +443 } +444 if (par[i].type != CMD_PARAM_BOOL) +445 longopt.has_arg = 1; +446 array_append(longopts, &longopt, 1); +447 } +448 array_append_zero(longopts); +449 }
+505 int doveadm_cmd_run_ver2(int argc, const char *const argv[], +506 struct doveadm_cmd_context *cctx) +507 { +508 struct doveadm_cmd_param *param; +509 ARRAY_TYPE(doveadm_cmd_param_arr_t) pargv; +510 ARRAY_TYPE(getopt_option_array) opts; +511 unsigned int pargc; +512 int c,li; +513 pool_t pool = pool_datastack_create(); +514 string_t *optbuf = str_new(pool, 64); +515 +516 p_array_init(&opts, pool, 4); +517 +518 // build parameters +519 doveadm_build_options(cctx->cmd->parameters, optbuf, &opts);
+530 while((c = getopt_long(argc, (char*const*)argv, str_c(optbuf), array_idx(&opts, 0), &li)) > -1) { +531 switch(c) { +532 case 0: +533 for(unsigned int i = 0; i < array_count(&pargv); i++) { +534 const struct option *opt = array_idx(&opts,li); +535 param = array_idx_modifiable(&pargv,i); +536 if (opt->name == param->name) +537 doveadm_fill_param(param, optarg, pool); +538 } +539 break; +540 case '?': +541 case ':': +542 doveadm_cmd_params_clean(&pargv); +543 return -1; +544 default: +545 // hunt the option +546 for(unsigned int i = 0; i < pargc; i++) { +547 const struct option *longopt = array_idx(&opts,i); +548 if (longopt->val == c) +549 doveadm_fill_param(array_idx_modifiable(&pargv,i), optarg, pool); +550 } +551 } +552 }
fyi: I solved the <getopt.h> issue with:
+11 #include <stdio.h>
+12 #include <unistd.h>
+13 /*
+14 * getopt.h is non-POSIX
+15 * on AIX getopt() is declared in unistd.h
+16 */
+17 #ifndef _AIX
+18 #include <getopt.h>
+19 #endif
Suggestions welcome!