示例#1
0
文件: main.c 项目: farewellkou/xen
static void call_main(void *p)
{
    char *c, quote;
#ifdef CONFIG_QEMU_XS_ARGS
    char *domargs, *msg;
#endif
    int argc;
    char **argv;
    char *envp[] = { NULL };
#ifdef CONFIG_QEMU_XS_ARGS
    char *vm;
    char path[128];
    int domid;
#endif
    int i;

    /* Let other parts initialize (including console output) before maybe
     * crashing. */
    //sleep(1);

    //printk("Start call_main : main.c\n");
#ifdef CONFIG_SPARSE_BSS
    sparse((unsigned long) &__app_bss_start, &__app_bss_end - &__app_bss_start);
#endif
#if defined(HAVE_LWIP) && defined(CONFIG_START_NETWORK) && defined(CONFIG_NETFRONT)
    start_networking();
#endif
#ifdef CONFIG_PCIFRONT
    create_thread("pcifront", pcifront_watches, NULL);
#endif

#ifdef CONFIG_QEMU_XS_ARGS
    /* Fetch argc, argv from XenStore */
    domid = xenbus_read_integer("target");
    if (domid == -1) {
        printk("Couldn't read target\n");
        do_exit();
    }

    snprintf(path, sizeof(path), "/local/domain/%d/vm", domid);
    msg = xenbus_read(XBT_NIL, path, &vm);
    if (msg) {
        printk("Couldn't read vm path\n");
        do_exit();
    }
    printk("dom vm is at %s\n", vm);

    snprintf(path, sizeof(path), "%s/image/dmargs", vm);
    free(vm);
    msg = xenbus_read(XBT_NIL, path, &domargs);

    if (msg) {
        printk("Couldn't get stubdom args: %s\n", msg);
        domargs = strdup("");
    }
#endif

    argc = 1;

#define PARSE_ARGS(ARGS,START,QUOTE,END) \
    c = ARGS; \
    quote = 0; \
    while (*c) { \
	if (*c != ' ') { \
	    START; \
	    while (*c) { \
		if (quote) { \
		    if (*c == quote) { \
			quote = 0; \
			QUOTE; \
			continue; \
		    } \
		} else if (*c == ' ') \
		    break; \
		if (*c == '"' || *c == '\'') { \
		    quote = *c; \
		    QUOTE; \
		    continue; \
		} \
		c++; \
	    } \
	} else { \
            END; \
	    while (*c == ' ') \
		c++; \
	} \
    } \
    if (quote) {\
	printk("Warning: unterminated quotation %c\n", quote); \
	quote = 0; \
    }
#define PARSE_ARGS_COUNT(ARGS) PARSE_ARGS(ARGS, argc++, c++, )
#define PARSE_ARGS_STORE(ARGS) PARSE_ARGS(ARGS, argv[argc++] = c, memmove(c, c + 1, strlen(c + 1) + 1), *c++ = 0)

    PARSE_ARGS_COUNT((char*)start_info.cmd_line);
#ifdef CONFIG_QEMU_XS_ARGS
    PARSE_ARGS_COUNT(domargs);
#endif

    argv = alloca((argc + 1) * sizeof(char *));
    argv[0] = "main";
    argc = 1;

    PARSE_ARGS_STORE((char*)start_info.cmd_line)
#ifdef CONFIG_QEMU_XS_ARGS
    PARSE_ARGS_STORE(domargs)
#endif

    argv[argc] = NULL;

    for (i = 0; i < argc; i++)
	printf("\"%s\" ", argv[i]);
    //printf("\n");

    __libc_init_array();
    environ = envp;
    for (i = 0; __CTOR_LIST__[i] != 0; i++)
        ((void((*)(void)))__CTOR_LIST__[i]) ();
    tzset();

    exit(main(argc, argv, envp));
}
示例#2
0
文件: t8.c 项目: tca/up
int main(int argc, char **argv) {
  int mode, sock;
  size_t length;

  // Alice's public and secret keys
  unsigned char *a_pk;
  unsigned char *a_sk;

  // Bob's public key
  unsigned char *b_pk;

  if (argc != 1 + 6) {
    fprintf(stderr, usage);
    return EXIT_FAILURE;
  }

  // read all the keys off the disk
  if (read_from_file(argv[2], &a_pk, &length)) {
    fprintf(stderr, "Failed to read sender's public key\n");
    return EXIT_FAILURE;
  }
  if (length != crypto_box_PUBLICKEYBYTES) {
    fprintf(stderr, "Failed to read sender's public key: incorrect size\n");
    return EXIT_FAILURE;
  }

  if (read_from_file(argv[3], &a_sk, &length)) {
    fprintf(stderr, "Failed to read sender's private key\n");
    return EXIT_FAILURE;
  }
  if (length != crypto_box_SECRETKEYBYTES) {
    fprintf(stderr, "Failed to read sender's private key: incorrect size\n");
    return EXIT_FAILURE;
  }

  if (read_from_file(argv[4], &b_pk, &length)) {
    fprintf(stderr, "Failed to read recipient's public key\n");
    return EXIT_FAILURE;
  }
  if (length != crypto_box_PUBLICKEYBYTES) {
    fprintf(stderr, "Failed to read recipient's public key: incorrect size\n");
  }

  if        (!strcmp(argv[1], "client")) {
    mode = client_mode;
  } else if (!strcmp(argv[1], "server")) {
    mode = server_mode;
  } else {
    fprintf(stderr, usage);
    return EXIT_FAILURE;
  }

  // Connect
  if(start_networking(mode, argv[5], argv[6], &sock)) {
    puts("Could not network..");
    close(sock);
    return EXIT_FAILURE;
  }

  unsigned char key[crypto_secretbox_KEYBYTES + crypto_box_ZEROBYTES] = {0};
  key_exchange(a_sk, b_pk, key, mode, sock);
  
  write_to_file((mode ? "alice.asymm" : "bob.asymm"), key + crypto_box_ZEROBYTES, crypto_secretbox_KEYBYTES);
  
  return 0;
}