int LYKeyForEditAction(int lec) { int editaction, i; for (i = FIRST_I; i >= 0; i = NEXT_I(i, KEYMAP_SIZE - 1)) { editaction = CurrentLineEditor()[i]; if (editaction == lec) { #ifdef NOT_ASCII if (i < 256) { return FROMASCII(i); } else #endif return i; } } return (-1); }
int main(int argc, char** argv) { /* Set the CWD */ char *home = getenv("HOME"); if (!home) { printf("Failed to load data directory\n"); return EXIT_FAILURE; } char *datadir = malloc(strlen(home) + 10); snprintf(datadir, strlen(home) + 10, "%s/.bitpeer", home); if (chdir(datadir) < 0) { if (mkdir(datadir, 0777) < 0) { printf("Failed to create data directory.\n"); return EXIT_FAILURE; } if (chdir(datadir) < 0) { printf("Failed to chdir\n"); return EXIT_FAILURE; } } free(datadir); /* For safety we do these protocol struct assertions */ assert(sizeof(bp_proto_message_s) == 24); assert(sizeof(bp_proto_net_addr_s) == 26); assert(sizeof(bp_proto_net_addr_full_s) == 30); assert(sizeof(bp_proto_version_s) == 80); assert(sizeof(bp_proto_inv_s) == 36); assert(sizeof(bp_btcblock_header_s) == 80); /* Set the settings */ bp_program_s program; memset(&program, 0, sizeof(program)); program.addrpool_size = 20480; program.min_connections = 8; program.max_connections = 4096; program.reindex_blocks = 0; program.relay_transactions = 1; program.relay_blocks = 1; program.txpool_size = 1024; program.blocks_per_getblocks = 500; /* Interpret the command line */ if (argc < 2) { printf("Invalid command line arguments.\n"); printf("Usage: bitpeer [listen_port] [public_ip] -n [seed_node]\n"); printf("public_ip and seed_node may optionally contain a port number.\n"); return EXIT_FAILURE; } unsigned short listen_port = atoi(argv[1]); if (listen_port == 0) { printf("Invalid port number specified. Valid ports go from 1 to 65535.\n"); return EXIT_FAILURE; } struct sockaddr_in6 sockaddr; int sockaddr_len = sizeof(struct sockaddr_in6); if (evutil_parse_sockaddr_port(argv[2], (struct sockaddr*)&sockaddr, &sockaddr_len) < 0) { printf("Invalid public_ip specified\n"); return EXIT_FAILURE; } if (sockaddr.sin6_family == AF_INET) { sockaddr = bp_in4to6((struct sockaddr_in*)&sockaddr); sockaddr_len = sizeof(struct sockaddr_in6); } if (sockaddr.sin6_port == 0) { sockaddr.sin6_port = ntohs(listen_port); } int nodecount = 0; struct sockaddr_in6 *nodeaddrs = NULL; int *nodelens = NULL; int *nodeperm = NULL; /* Now interpret the optional arguments */ // Quick preprocessor macro to go to the next argv #define NEXT_I() {i++; if (i >= argc) { printf("Argument for %s missing\n", argv[i-1]); return EXIT_FAILURE; }} for (int i = 3; i < argc; i++) { if (strcmp(argv[i], "--reindex") == 0) { program.reindex_blocks = 1; } else if (strcmp(argv[i], "--addnode") == 0 || strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--addpnode") == 0 || strcmp(argv[i], "-p") == 0) { NEXT_I(); nodeaddrs = realloc(nodeaddrs, (nodecount+1) * sizeof(struct sockaddr_in6)); nodelens = realloc(nodelens, (nodecount+1) * sizeof(int)); nodeperm = realloc(nodeperm, (nodecount+1) * sizeof(int)); nodelens[nodecount] = sizeof(struct sockaddr_in6); nodeperm[nodecount] = 0; if (strcmp(argv[i-1], "--addpnode") == 0 || strcmp(argv[i-1], "-p") == 0) { printf("Adding a permanent node\n"); nodeperm[nodecount] = 1; } struct sockaddr_in6 *addr = &nodeaddrs[nodecount]; memset(addr, 0, sizeof(struct sockaddr_in6)); if (evutil_parse_sockaddr_port(argv[i], (struct sockaddr*)addr, nodelens+nodecount) < 0) { printf("Invalid node address specified: %s %d\n", argv[i], nodelens[nodecount]); return EXIT_FAILURE; } if (addr->sin6_family == AF_INET) { *addr = bp_in4to6((struct sockaddr_in*)addr); nodelens[nodecount] = sizeof(struct sockaddr_in6); } assert(addr->sin6_family == AF_INET6); if (addr->sin6_port == 0) addr->sin6_port = ntohs(8333); nodecount += 1; } else if (strcmp(argv[i], "--txpool") == 0) { NEXT_I(); program.txpool_size = atoi(argv[i]); if (program.txpool_size <= 0) { printf("Invalid argument for %s\n", argv[i-1]); return EXIT_FAILURE; } } else if (strcmp(argv[i], "--addrpool") == 0) { NEXT_I(); program.addrpool_size = atoi(argv[i]); if (program.addrpool_size <= 0) { printf("Invalid argument for %s\n", argv[i-1]); return EXIT_FAILURE; } } else if (strcmp(argv[i], "--getblocks-limit") == 0) { NEXT_I(); program.blocks_per_getblocks = atoi(argv[i]); if (program.blocks_per_getblocks == 0) { printf("Invalid argument for %s\n", argv[i-1]); return EXIT_FAILURE; } } else if (strcmp(argv[i], "--no-tx") == 0) { program.relay_transactions = 0; } else if (strcmp(argv[i], "--no-blocks") == 0) { program.relay_blocks = 0; } else if (strcmp(argv[i], "--minconn") == 0) { NEXT_I(); program.min_connections = atoi(argv[i]); } else if (strcmp(argv[i], "--maxconn") == 0) { NEXT_I(); program.max_connections = atoi(argv[i]); if (program.max_connections <= 0) { printf("Invalid argument for %s\n", argv[i-1]); return EXIT_FAILURE; } } else if (strcmp(argv[i], "--evdebug") == 0) { #ifdef EVENT_DBG_ALL event_enable_debug_logging(EVENT_DBG_ALL); #endif event_set_log_callback(log_cb); event_enable_debug_mode(); } else { printf("Unknown argument '%s'\n", argv[i]); return EXIT_FAILURE; } } /* Ignore SIGPIPE */ struct sigaction act; act.sa_handler = SIG_IGN; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGPIPE, &act, NULL); /* Create the main loop */ bp_program_init(&program); program.eventbase = event_base_new(); /* Set up the signal handler */ struct event *signal_event = evsignal_new(program.eventbase, SIGINT, signal_cb, &program); evsignal_add(signal_event, NULL); /* Create a server */ bp_server_s server; program.server = &server; bp_server_init(&server, &program, (char*)&sockaddr.sin6_addr, ntohs(sockaddr.sin6_port)); if (bp_server_listen(&server, listen_port) < 0) { return EXIT_FAILURE; } /* We need to connect to one initial node in order to seed everything. We will not do this initial discovery ourselves. */ for (int i = 0; i < nodecount; i++) { bp_connection_s *seed_connection = malloc(sizeof(bp_connection_s)); int status = bp_connection_connect(seed_connection, &server, &nodeaddrs[i], nodelens[i]); if (status < 0) { printf("Connecting failed\n"); } seed_connection->is_seed = 1; seed_connection->is_permanent = nodeperm[i]; } free(nodeaddrs); free(nodelens); free(nodeperm); /* Run the loop */ event_base_loop(program.eventbase, 0); printf("Entering clean shutdown state\n"); /* It would appear that our loop ended, so clean up */ event_free(signal_event); bp_server_deinit(&server); bp_program_deinit(&program); event_base_free(program.eventbase); return EXIT_SUCCESS; }
/* * Given a lynxactioncode, return a key (lynxkeycode) or sequence of two keys * that results in the given action while forms-editing. The main keycode is * returned as function value, possibly with modifier bits set; in addition, if * applicable, a key that sets the required modifier flag is returned in * *pmodkey if (pmodkey!=NULL). Non-lineediting bindings that would require * typing LYE_LKCMD (default ^V) to activate are not checked here, the caller * should do that separately if required. If no key is bound by current * line-editor bindings to the action, -1 is returned. * * This is all a bit long - it is general enough to continue to work should the * three Mod<N>Binding[] become different tables. - kw */ int LYEditKeyForAction(int lac, int *pmodkey) { int editaction, i, c; int mod1found = -1, mod2found = -1, mod3found = -1; if (pmodkey) *pmodkey = -1; for (i = FIRST_I; i >= 0; i = NEXT_I(i, KEYMAP_SIZE - 1)) { editaction = CurrentLineEditor()[i]; #ifdef NOT_ASCII if (i < 256) { c = FROMASCII(i); } else #endif c = i; if (editaction == (lac | LYE_FORM_LAC)) return c; if (editaction == LYE_FORM_PASS) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, c) == lac) return c; #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, c) == lac) return c; } if (editaction == LYE_TAB) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, '\t') == lac) return c; #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, '\t') == lac) return c; } if (editaction == LYE_SETM1 && mod1found < 0) mod1found = i; if (editaction == LYE_SETM2 && mod2found < 0) mod2found = i; if ((editaction & LYE_DF) && mod3found < 0) mod3found = i; } #ifdef USE_ALT_BINDINGS if (mod3found >= 0) { for (i = mod3found; i >= 0; i = NEXT_I(i, LAST_MOD3_LKC)) { editaction = CurrentLineEditor()[i]; if (!(editaction & LYE_DF)) continue; editaction = Mod3Binding[i]; #ifdef NOT_ASCII if (i < 256) { c = FROMASCII(i); } else #endif c = i; if (pmodkey) *pmodkey = c; if (editaction == (lac | LYE_FORM_LAC)) return (c | LKC_MOD3); if (editaction == LYE_FORM_PASS) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, c) == lac) return (c | LKC_MOD3); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, c) == lac) return (c | LKC_MOD3); } if (editaction == LYE_TAB) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, '\t') == lac) return (c | LKC_MOD3); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, '\t') == lac) return (c | LKC_MOD3); } } } if (mod1found >= 0) { if (pmodkey) { #ifdef NOT_ASCII if (mod1found < 256) { *pmodkey = FROMASCII(mod1found); } else #endif *pmodkey = mod1found; } for (i = FIRST_I; i >= 0; i = NEXT_I(i, LAST_MOD1_LKC)) { editaction = Mod1Binding[i]; #ifdef NOT_ASCII if (i < 256) { c = FROMASCII(i); } else #endif c = i; if (editaction == (lac | LYE_FORM_LAC)) return (c | LKC_MOD1); if (editaction == LYE_FORM_PASS) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, c) == lac) return (c | LKC_MOD1); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, c) == lac) return (c | LKC_MOD1); } if (editaction == LYE_TAB) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, '\t') == lac) return (c | LKC_MOD1); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, '\t') == lac) return (c | LKC_MOD1); } } } if (mod2found >= 0) { if (pmodkey) { #ifdef NOT_ASCII if (mod1found < 256) { *pmodkey = FROMASCII(mod1found); } else #endif *pmodkey = mod1found; } for (i = FIRST_I; i >= 0; i = NEXT_I(i, LAST_MOD2_LKC)) { editaction = Mod2Binding[i]; #ifdef NOT_ASCII if (i < 256) { c = FROMASCII(i); } else #endif c = i; if (editaction == (lac | LYE_FORM_LAC)) return (c | LKC_MOD2); if (editaction == LYE_FORM_PASS) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, c) == lac) return (c | LKC_MOD2); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, c) == lac) return (c | LKC_MOD2); } if (editaction == LYE_TAB) { #if defined(DIRED_SUPPORT) && defined(OK_OVERRIDE) if (lynx_edit_mode && !no_dired_support && lac && LKC_TO_LAC(key_override, '\t') == lac) return (c | LKC_MOD2); #endif /* DIRED_SUPPORT && OK_OVERRIDE */ if (LKC_TO_LAC(keymap, '\t') == lac) return (c | LKC_MOD2); } } } #endif /* USE_ALT_BINDINGS */ if (pmodkey) *pmodkey = -1; return (-1); }