Ejemplo n.º 1
0
/* _main_getopt(): extract option map from command line.
*/
static u3_noun
_main_getopt(c3_i argc, c3_c** argv)
{
  c3_i ch_i;
  c3_w arg_w;

  u3_Host.ops_u.abo = c3n;
  u3_Host.ops_u.bat = c3n;
  u3_Host.ops_u.gab = c3n;
  u3_Host.ops_u.loh = c3n;
  u3_Host.ops_u.dem = c3n;
  u3_Host.ops_u.fog = c3n;
  u3_Host.ops_u.fak = c3n;
  u3_Host.ops_u.tex = c3n;
  u3_Host.ops_u.pro = c3n;
  u3_Host.ops_u.dry = c3n;
  u3_Host.ops_u.veb = c3n;
  u3_Host.ops_u.qui = c3n;
  u3_Host.ops_u.nuu = c3n;
  u3_Host.ops_u.mem = c3n;
  u3_Host.ops_u.rep = c3n;
  u3_Host.ops_u.kno_w = DefaultKernel;

  while ( (ch_i=getopt(argc, argv,"I:w:t:f:k:l:n:p:r:LabcdgqvxFMPDXR")) != -1 ) {
    switch ( ch_i ) {
      case 'M': {
        u3_Host.ops_u.mem = c3y;
        break;
      }
      case 'I': {
        u3_Host.ops_u.imp_c = _main_presig(optarg);
        break;
      }
      case 'w': {
        u3_Host.ops_u.who_c = _main_presig(optarg);
        u3_Host.ops_u.nuu = c3y;
        break;
      }
      case 't': {
        u3_Host.ops_u.tic_c = _main_presig(optarg);
        break;
      }
      case 'x': {
        u3_Host.ops_u.tex = c3y;
        break;
      }
      case 'X': {
        u3_Host.ops_u.fog = c3y;
        break;
      }
      case 'f': {
        if ( c3n == _main_readw(optarg, 100, &u3_Host.ops_u.fuz_w) ) {
          return c3n;
        }
        break;
      }
      case 'k': {
        if ( c3n == _main_readw(optarg, 256, &u3_Host.ops_u.kno_w) ) {
          return c3n;
        }
        break;
      }
      case 'l': {
        if ( c3n == _main_readw(optarg, 65536, &arg_w) ) {
          return c3n;
        } else u3_Host.ops_u.rop_s = arg_w;
        break;
      }
      case 'n': {
        u3_Host.ops_u.nam_c = strdup(optarg);
        break;
      }
      case 'p': {
        if ( c3n == _main_readw(optarg, 65536, &arg_w) ) {
          return c3n;
        } else u3_Host.ops_u.por_s = arg_w;
        break;
      }
      case 'r': {
        u3_Host.ops_u.raf_c = strdup(optarg);
        break;
      }
      case 'R': {
        u3_Host.ops_u.rep = c3y;
        return c3y;
      }
      case 'L': { u3_Host.ops_u.loh = c3y; break; }
      case 'F': {
        u3_Host.ops_u.loh = c3y;
        u3_Host.ops_u.fak = c3y;
        break;
      }
      case 'a': { u3_Host.ops_u.abo = c3y; break; }
      case 'b': { u3_Host.ops_u.bat = c3y; break; }
      case 'c': { u3_Host.ops_u.nuu = c3y; break; }
      case 'd': { u3_Host.ops_u.dem = c3y; break; }
      case 'g': { u3_Host.ops_u.gab = c3y; break; }
      case 'P': { u3_Host.ops_u.pro = c3y; break; }
      case 'D': { u3_Host.ops_u.dry = c3y; break; }
      case 'q': { u3_Host.ops_u.qui = c3y; break; }
      case 'v': { u3_Host.ops_u.veb = c3y; break; }
      case '?': default: {
        return c3n;
      }
    }
  }

  if ( u3_Host.ops_u.rop_s == 0 && u3_Host.ops_u.raf_c != 0 ) {
    fprintf(stderr, "The -r flag requires -l.\n");
    return c3n;
  }

  if ( u3_Host.ops_u.tic_c == 0 && u3_Host.ops_u.who_c != 0 ) {
      c3_c tic_c[29];
      printf("your ticket: ~");
      scanf("%28s",tic_c);
      u3_Host.ops_u.tic_c = _main_presig(tic_c);
  }

  if ( c3y == u3_Host.ops_u.bat ) {
    u3_Host.ops_u.dem = c3y;
    u3_Host.ops_u.nuu = c3y;
  }


  if ( u3_Host.ops_u.nam_c == 0 ) {
    u3_Host.ops_u.nam_c = getenv("HOSTNAME");
    if ( u3_Host.ops_u.nam_c == 0 ) {
      c3_w len_w = sysconf(_SC_HOST_NAME_MAX) + 1;

      u3_Host.ops_u.nam_c = hostbuf;
      if ( 0 != gethostname(u3_Host.ops_u.nam_c, len_w) ) {
        perror("gethostname");
        exit(1);
      }
    }
  }

  if ( argc != (optind + 1) && u3_Host.ops_u.who_c != 0 ) {
    u3_Host.dir_c = strdup(1 + u3_Host.ops_u.who_c);
  }

  if ( argc != (optind + 1) ) {
    return u3_Host.dir_c ? c3y : c3n;
  } else {
    {
      c3_c* ash_c;

      if ( (ash_c = strrchr(argv[optind], '/')) && (ash_c[1] == 0) ) {
        *ash_c = 0;
      }
    }

    u3_Host.dir_c = strdup(argv[optind]);
    return c3y;
  }
}
/* _main_getopt(): extract option map from command line.
*/
static u2_bean
_main_getopt(c3_i argc, c3_c** argv)
{
  c3_i ch_i;
  c3_w arg_w;

  u2_Host.ops_u.abo = u2_no;
  u2_Host.ops_u.bat = u2_no;
  u2_Host.ops_u.gab = u2_no;
  u2_Host.ops_u.loh = u2_no;
  u2_Host.ops_u.dem = u2_no;
  u2_Host.ops_u.fog = u2_no;
  u2_Host.ops_u.fak = u2_no;
  u2_Host.ops_u.pro = u2_no;
  u2_Host.ops_u.veb = u2_yes;
  u2_Host.ops_u.nuu = u2_no;
  u2_Host.ops_u.mem = u2_no;
  u2_Host.ops_u.kno_w = DefaultKernel;
  u2_Host.ops_u.kaf_c = (c3_c*) NULL;

  while ( (ch_i = getopt(argc, argv, "I:A:K:X:f:k:l:n:p:r:LabcdgqvFM")) != -1 ) {
    switch ( ch_i ) {
      case 'A': {
        u2_Host.ops_u.adm_c = strdup(optarg);
        if ((strcmp(optarg, "edmp") != 0) && 
            (strcmp(optarg, "etok") != 0) && 
            (strcmp(optarg, "ktoe") != 0) &&
            (strcmp(optarg, "kcnf") != 0) ) {
          fprintf(stderr, "illegal -A subcommand: %s\n",  optarg);
          return u2_no;

        }
        break;
      }
      case 'M': {
       u2_Host.ops_u.mem = u2_yes;
        break;
      }
      case 'I': {
        u2_Host.ops_u.imp_c = strdup(optarg);
        break;
      }
      case 'X': {
        if ( 0 != strcmp("wtf", optarg) ) {
          fprintf(stderr, "problem with -X\n");
          return u2_no;
        } else u2_Host.ops_u.fog = u2_yes;
        break;
      }
      case 'f': {
        if ( u2_no == _main_readw(optarg, 100, &u2_Host.ops_u.fuz_w) ) {
          fprintf(stderr, "problem with -f\n");
          return u2_no;
        }
        break;
      }
      case 'k': {
        if ( u2_no == _main_readw(optarg, 256, &u2_Host.ops_u.kno_w) ) {
          fprintf(stderr, "problem with -k\n");
          return u2_no;
        }
        break;
      }
      case 'n': {
        u2_Host.ops_u.nam_c = strdup(optarg);
        break;
      }
      case 'p': {
        if ( u2_no == _main_readw(optarg, 65536, &arg_w) ) {
          fprintf(stderr, "problem with -p\n");
          return u2_no;
        } else u2_Host.ops_u.por_s = arg_w;
        break;
      }
      case 'L': { u2_Host.ops_u.loh = u2_yes; break; }
      case 'F': {
        u2_Host.ops_u.loh = u2_yes;
        u2_Host.ops_u.fak = u2_yes;
        break;
      }
      case 'K': {
        u2_Host.ops_u.kaf_c  = strdup(optarg);
        break;
      }

      case 'a': { u2_Host.ops_u.abo = u2_yes; break; }
      case 'b': { u2_Host.ops_u.bat = u2_yes; break; }
      case 'c': { u2_Host.ops_u.nuu = u2_yes; break; }
      case 'd': { u2_Host.ops_u.dem = u2_yes; break; }
      case 'g': { u2_Host.ops_u.gab = u2_yes; break; }
      case 'q': { u2_Host.ops_u.veb = u2_no; break; }
      case 'v': { u2_Host.ops_u.veb = u2_yes; break; }
      case '?': default: {
        return u2_no;
      }
    }
  }

  if ( u2_yes == u2_Host.ops_u.bat ) {
    u2_Host.ops_u.dem = u2_yes;
    u2_Host.ops_u.nuu = u2_yes;
  }


  if ( u2_Host.ops_u.nam_c == 0 ) {
    u2_Host.ops_u.nam_c = getenv("HOSTNAME");
    if ( u2_Host.ops_u.nam_c == 0 ) {
      c3_w len_w = sysconf(_SC_HOST_NAME_MAX) + 1;

      u2_Host.ops_u.nam_c = c3_malloc(len_w);
      if ( 0 != gethostname(u2_Host.ops_u.nam_c, len_w) ) {
        perror("gethostname");
        exit(1);
      }
    }
  }

  // N.B. this used to be something like 'mypier', which specified computer name
  // As of July 2014, computer name = ship name = name of directory in ~/urb where pier lives
  //
  // find shipname
  //
  if ( argc != (optind + 1) ) {
    fprintf(stderr, "You must specify your ship name on the command line.\n");
    exit(1);
  } 
  if (argv[optind][0] != '~'){
    fprintf(stderr, "You must specify your ship name (not pier). Names begin with '~'.\n");
    exit(1);
  }

  u2_Host.cpu_c = strdup(argv[optind]);
  return u2_yes;

}