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!

Reply via email to