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)); }
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; }