int kad_export_nodes( IP addr_array[], size_t *num ) { IP4 addr4[64]; IP6 addr6[64]; int num4; int num6; int i, count; num6 = N_ELEMS( addr6 ); num4 = N_ELEMS( addr4 ); dht_lock(); dht_get_nodes( addr4, &num4, addr6, &num6 ); dht_unlock(); count = 0; for( i = 0; i < num6 && count < *num; ++i, ++count ) { memcpy( &addr_array[i], &addr6[i], sizeof(IP6) ); } for( i = 0; i < num4 && count < *num; ++i, ++count ) { memcpy( &addr_array[i], &addr4[i], sizeof(IP4) ); } /* Store number of nodes we have actually found */ *num = count; return 0; }
void cmd_console_handler( int rc, int fd ) { char request[512]; char *req; REPLY reply; char *argv[32]; int argc; if( rc == 0 ) { return; } /* Read line */ req = fgets( request, sizeof(request), stdin ); if( req == NULL ) { return; } /* Split up the command line into an argument array */ cmd_to_args( request, &argc, &argv[0], N_ELEMS(argv) ); /* Initialize reply */ r_init( &reply, true ); /* Execute command line */ rc = cmd_exec( &reply, argc, argv ); if( rc == 0 ) { fprintf( stdout, "%.*s\n", (int) reply.size, reply.data ); } else { fprintf( stderr, "%.*s\n", (int) reply.size, reply.data ); } }
void cmd_remote_handler( int rc, int sock ) { char* argv[32]; int argc; IP clientaddr; socklen_t addrlen_ret; socklen_t addrlen; char request[1500]; REPLY reply; addrlen_ret = sizeof(IP); rc = recvfrom( sock, request, sizeof(request) - 1, 0, (struct sockaddr*)&clientaddr, &addrlen_ret ); if( rc <= 0 ) { return; } else { request[rc] = '\0'; } /* Initialize reply and reserve room for return status */ r_init( &reply, false ); r_printf( &reply, "_" ); /* Split up the command line into an argument array */ cmd_to_args( request, &argc, &argv[0], N_ELEMS(argv) ); /* Execute command line */ rc = cmd_exec( &reply, argc, argv ); /* Insert return code */ reply.data[0] = (rc == 0) ? '0' : '1'; addrlen = addr_len( &clientaddr ); rc = sendto( sock, reply.data, reply.size, 0, (struct sockaddr *)&clientaddr, addrlen ); }
telf_status symentryfs_build(telf_ctx *ctx, telf_obj *parent) { telf_status ret; telf_status rc; telf_obj *entry = NULL; int i; for (i = 0; i < N_ELEMS(symentryfs_fcb); i++) { telf_fcb *fcb = symentryfs_fcb + i; entry = elf_obj_new(ctx, fcb->str, parent, ELF_SYMBOL_ENTRY, ELF_S_IFREG); if (! entry) { ERR("can't build entry '%s'", fcb->str); continue; } entry->free_func = fcb->freecontent_func; entry->fill_func = fcb->setcontent_func; symentryfs_override_driver(entry->driver); list_add(parent->entries, entry); } ret = ELF_SUCCESS; end: return ret; }
telf_status symentryfs_build(telf_ctx *ctx, telf_obj *parent) { telf_obj *entry = NULL; for (size_t i = 0; i < N_ELEMS(symentryfs_fcb); i++) { telf_fcb *fcb = symentryfs_fcb + i; entry = elf_obj_new(ctx, fcb->str, parent, ELF_SYMBOL_ENTRY, ELF_S_IFREG); if (! entry) { ERR("can't build entry '%s'", fcb->str); continue; } entry->free_func = fcb->freecontent_func; entry->fill_func = fcb->fillcontent_func; list_add(parent->entries, entry); } return ELF_SUCCESS; }
/* * Translate the error code of a PlxApi error */ XIA_EXPORT void XIA_API plx_print_error(int errorcode, char *errorstring) { int i; for (i = 0; i < N_ELEMS(ApiErrors); i++) { if ((int)ApiErrors[i].code == errorcode) { sprintf(errorstring, "Error caught in plxlib, %s", ApiErrors[i].text); return; } } for (i = 0; i < N_ELEMS(XiaPlxErrors); i++) { if (XiaPlxErrors[i].code == errorcode) { sprintf(errorstring, "Error caught in plxlib, %s", XiaPlxErrors[i].text); return; } } sprintf(errorstring, "UNKNOWN ERROR (%d) caught in plxlib", errorcode); }
/* * Prints out more error information based on the strings in the * API from PLX Technology. */ static void _plx_print_more(PLX_STATUS errorcode) { int i; for (i = 0; i < N_ELEMS(ApiErrors); i++) { if ((int)ApiErrors[i].code == errorcode) { _plx_log_DEBUG("Error caught in plxlib, %s\n", ApiErrors[i].text); return; } } _plx_log_DEBUG("UNKNOWN ERROR (%d) caught in plxlib\n", errorcode); }
/* handle 'GET /lookup?foo.p2p' */ void handle_lookup( char *reply_buf, const char *params ) { char addrbuf[FULL_ADDSTRLEN+1]; IP addrs[MAX_ADDRS]; size_t num; size_t i, n; /* Lookup id - starts search when not already done */ num = N_ELEMS(addrs); if( kad_lookup_value( params, addrs, &num ) >= 0 && num > 0 ) { for( n = 0, i = 0; i < num; i++ ) { n += sprintf( reply_buf + n, "%s\n", str_addr( &addrs[i], addrbuf ) ); } } }
static telf_status symentryfs_getattr(void *obj_hdl, telf_stat *stp) { telf_obj *obj = obj_hdl; telf_status ret; telf_status rc; telf_stat st; int i; elf_obj_lock(obj); DEBUG("name:%s data=%p", obj->name, obj->data); memset(&st, 0, sizeof st); st.st_mode |= ELF_S_IFREG; for (i = 0; i < N_ELEMS(symentryfs_fcb); i++) { telf_fcb *fcb = symentryfs_fcb + i; if (0 == strcmp(obj->name, fcb->str)) { rc = fcb->getsize_func(obj, &st.st_size); if (ELF_SUCCESS != rc) { ERR("can't get size of '%s'", obj->name); ret = rc; goto end; } break; } } ret = ELF_SUCCESS; end: elf_obj_unlock(obj); if (stp) *stp = st; DEBUG("ret=%s (%d)", elf_status_to_str(ret), ret); return ret; }
telf_status headerfs_build(telf_ctx *ctx) { telf_obj *header_obj = NULL; telf_status ret; telf_status rc; rc = elf_namei(ctx, "/header", &header_obj); if (ELF_SUCCESS != rc) { ERR("can't find '/header' object: %s", elf_status_to_str(rc)); ret = rc; goto end; } /* now add the pseudo files */ for (size_t i = 0; i < N_ELEMS(headerfs_fcb); i++) { telf_obj *entry = NULL; telf_fcb *fcb = headerfs_fcb + i; entry = elf_obj_new(ctx, fcb->str, header_obj, ELF_HEADER_ENTRY, ELF_S_IFREG); if (! entry) { ERR("can't build entry '%s'", fcb->str); continue; } headerfs_override_driver(entry->driver); entry->free_func = fcb->freecontent_func; entry->fill_func = fcb->fillcontent_func; list_add(header_obj->entries, entry); } ret = ELF_SUCCESS; end: return ret; }
/* Export up to 32 peer addresses - more would not fit into one UDP packet */ int cmd_export( REPLY *r ) { char addrbuf[FULL_ADDSTRLEN+1]; IP addr_array[32]; size_t addr_num; size_t i; addr_num = N_ELEMS(addr_array); if( kad_export_nodes( addr_array, &addr_num ) != 0 ) { return 1; } for( i = 0; i < addr_num; ++i ) { r_printf( r, "%s\n", str_addr( &addr_array[i], addrbuf ) ); } if( i == 0 ) { r_printf( r, "No good nodes found.\n" ); return 1; } return 0; }
static telf_status headerfs_release(void *ctx_hdl, const char *path) { telf_ctx *ctx = ctx_hdl; telf_obj *obj = NULL; telf_fcb *fcb = NULL; telf_status ret; telf_status rc; int locked = 0; elf_ctx_lock(ctx); rc = elf_namei(ctx, path, &obj); if (ELF_SUCCESS != rc) { ERR("namei(%s) failed: %d", path, rc); ret = -ENOENT; goto end; } elf_obj_lock(obj); locked = 1; elf_obj_unref_nolock(obj); DEBUG("name:%s data=%p", obj->name, obj->data); fcb = elf_get_fcb(headerfs_fcb, N_ELEMS(headerfs_fcb), obj->name); if (! fcb) { ERR("no fcb matching obj '%s'", obj->name); ret = ELF_ENOENT; goto end; } if (fcb->release_func) { rc = fcb->release_func(obj); if (ELF_SUCCESS != rc) { ERR("release ('%s') failed: %s", obj->name, elf_status_to_str(rc)); ret = rc; goto end; } } if (0 == obj->refcount) { if (obj->free_func) { obj->free_func(obj->data); obj->data = NULL; } } ret = ELF_SUCCESS; end: if (locked) elf_obj_unlock(obj); elf_ctx_unlock(ctx); return ret; }
int cmd_exec( REPLY *r, int argc, char **argv ) { char addrbuf[FULL_ADDSTRLEN+1]; time_t lifetime; int minutes; IP addrs[16]; int port; int count; static struct value_t *value; char *p; int rc = 0; if( argc == 0 ) { /* Print usage */ r_printf( r, cmd_usage ); if( r->allow_debug ) { r_printf( r, cmd_usage_debug ); } rc = 1; } else if( match( argv[0], "import" ) && argc == 2 ) { rc = cmd_import( r, argv[1] ); #if 0 } else if( match( argv[0], "lookup_node" ) && argc == 2 ) { /* Check searches for node */ rc = kad_lookup_node( argv[1], &addrs[0] ); if( rc == 0 ) { r_printf( r, "%s\n", str_addr( &addrs[0], addrbuf ) ); } else if( rc == 1 ) { r_printf( r ,"No search found.\n" ); rc = 1; } else if( rc == 2 ) { r_printf( r ,"Invalid id format. 20 digit hex string expected.\n" ); rc = 1; } else { rc = 1; } #endif } else if( match( argv[0], "lookup" ) && argc == 2 ) { size_t num = N_ELEMS(addrs); size_t i; /* Check searches for node */ rc = kad_lookup_value( argv[1], addrs, &num ); if( rc >= 0 && num > 0 ) { for( i = 0; i < num; ++i ) { r_printf( r, "%s\n", str_addr( &addrs[i], addrbuf ) ); } } else if( rc < 0 ) { r_printf( r ,"Some error occured.\n" ); rc = 1; } else if( rc == 0 ) { r_printf( r ,"Search in progress.\n" ); rc = 1; } else { r_printf( r ,"Search started.\n" ); rc = 1; } } else if( match( argv[0], "status" ) && argc == 1 ) { /* Print node id and statistics */ cmd_print_status( r ); } else if( match( argv[0], "announce" ) && (argc == 1 || argc == 2 || argc == 3) ) { if( argc == 1 ) { /* Announce all values; does not update value.refreshed */ count = 0; value = values_get(); while( value ) { kad_announce_once( value->id, value->port ); count++; value = value->next; } r_printf( r ,"%d announcements started.\n", count ); rc = 0; goto end; } else if( argc == 2 ) { minutes = 0; lifetime = 0; } else if( argc == 3 ) { minutes = atoi( argv[2] ); if( minutes < 0 ) { minutes = 0; lifetime = LONG_MAX; } else { /* Round up to multiple of 30 minutes */ minutes = (30 * (minutes/30 + 1)); lifetime = (time_now_sec() + (minutes * 60)); } } else { /* Make compilers happy */ exit( 1 ); } int is_random_port = 0; /* Find <id>:<port> delimiter */ p = strchr( argv[1], ':' ); if( p ) { *p = '\0'; port = port_parse( p + 1, -1 ); } else { /* A valid port will be choosen inside kad_announce() */ port = 0; is_random_port = 1; } if( kad_announce( argv[1], port, lifetime ) >= 0 ) { #ifdef FWD if( !is_random_port ) { forwardings_add( port, lifetime); } #endif if( lifetime == 0 ) { r_printf( r ,"Start single announcement now.\n" ); } else if( lifetime == LONG_MAX ) { r_printf( r ,"Start regular announcements for the entire run time (%sport %d).\n", (is_random_port ? "random " : ""), port ); } else { r_printf( r ,"Start regular announcements for %d minutes (%sport %d).\n", minutes, (is_random_port ? "random " : ""), port ); } } else { r_printf( r ,"Invalid port or query too long.\n" ); rc = 1; } } else if( match( argv[0], "blacklist" ) && argc == 2 ) { rc = cmd_blacklist( r, argv[1] ); } else if( match( argv[0], "export" ) && argc == 1 ) { rc = cmd_export( r ); } else if( match( argv[0], "list" ) && argc == 2 && r->allow_debug ) { if( gconf->is_daemon == 1 ) { r_printf( r ,"The 'list' command is not available while KadNode runs as daemon.\n" ); rc = 1; goto end; } else if( match( argv[1], "blacklist" ) ) { kad_debug_blacklist( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "buckets" ) ) { kad_debug_buckets( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "constants" ) ) { kad_debug_constants( STDOUT_FILENO ); rc = 0; #ifdef FWD } else if( match( argv[1], "forwardings" ) ) { forwardings_debug( STDOUT_FILENO ); rc = 0; #endif #ifdef AUTH } else if( match( argv[1], "pkeys" ) ) { auth_debug_pkeys( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "skeys" ) ) { auth_debug_skeys( STDOUT_FILENO ); rc = 0; #endif } else if( match( argv[1], "results" ) ) { results_debug( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "searches" ) ) { kad_debug_searches( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "storage" ) ) { kad_debug_storage( STDOUT_FILENO ); rc = 0; } else if( match( argv[1], "values" ) ) { values_debug( STDOUT_FILENO ); rc = 0; } else { dprintf( STDERR_FILENO, "Unknown argument.\n" ); rc = 1; } r_printf( r ,"\nOutput send to console.\n" ); } else { /* print usage */ r_printf( r, cmd_usage ); if( r->allow_debug ) { r_printf( r, cmd_usage_debug ); } rc = 1; } end: ; return rc; }
static inline void i2c_commandDequeue(RemoteCommand *command) { *command = commandQueue[qHead]; qHead = (qHead + 1) % N_ELEMS(commandQueue); }
static inline void i2c_commandEnqueue(RemoteCommand *command) { commandQueue[qTail] = *command; qTail = (qTail + 1) % N_ELEMS(commandQueue); }
static inline uint8_t i2c_commandQueueFull() { return (qHead == (qTail + 1) % N_ELEMS(commandQueue)); }