void app_dns_sd(char *arg, struct pico_ip4 address) { char *hostname; char *nxt = arg; uint64_t starttime = 0; int once = 0; if (!nxt) { exit(255); } nxt = cpy_arg(&hostname, nxt); if(!hostname) { exit(255); } if(!nxt) { printf("Not enough args supplied!\n"); exit(255); } nxt = cpy_arg(&service_name, nxt); if(!service_name) { exit(255); } printf("\nStarting DNS Service Discovery module...\n"); if (pico_dns_sd_init(hostname, address, &dns_sd_init_callback, NULL) != 0) { printf("Initialisation returned with Error!\n"); exit(255); } printf("\nTry reinitialising DNS-SD\n"); if (pico_dns_sd_init(hostname, address, &dns_sd_init_callback, NULL)) { printf("Initialisation returned with Error!\n"); exit(255); } printf("DONE - Re-initialising DNS-SD module.\n"); starttime = PICO_TIME_MS(); printf("Starting time: %d\n", starttime); while(1) { pico_stack_tick(); usleep(2000); if (((PICO_TIME_MS() - starttime) > SECONDS * 1000) && fully_initialized && !once) { printf("\nTry reinitialising DNS-SD (a second time)\n"); if (pico_dns_sd_init(hostname, address, &dns_sd_init_callback, NULL)) { printf("Initialisation returned with Error!\n"); exit(255); } once = 1; printf("DONE - Re-initialising mDNS module. (a second time)\n"); } } }
struct command_t *parse_arguments_recursive(struct command_t *commands, char *arg) { char *next; char *operation; char *filename; char *address; static union pico_address remote_address; int ret; if (!arg) return commands; next = cpy_arg(&operation, arg); switch (*operation) { case 'S': case 's': filename = address = NULL; break; case 'T': case 'R': case 't': case 'r': if (!next) { fprintf(stderr, "Incomplete client command %s (filename componet is missing)\n", arg); return NULL; } next = cpy_arg(&filename, next); if (!next) { fprintf(stderr, "Incomplete client command %s (address component is missing)\n", arg); return NULL; } next = cpy_arg(&address, next); if (!IPV6_MODE) ret = pico_string_to_ipv4(address, &remote_address.ip4.addr); else ret = pico_string_to_ipv6(address, remote_address.ip6.addr); if (ret < 0) { fprintf(stderr, "Invalid IP address %s\n", address); print_usage(2); } break; default: fprintf(stderr, "Invalid command %s\n", operation); return NULL; }; return parse_arguments_recursive(add_command(commands, *operation, filename, &remote_address), next); }
int main (int argc, char **argv) { if (argc == 2) { printf ("code_pirate = %p\n", code_pirate); cpy_arg (argv[1]); printf ("argv[1] copier\n"); } return 0; }
void my_parse(t_env *e) { int i; int nb; i = 0; nb = 0; while (e->arg[i]) { if (check_ac(e->arg[i])) { cpy_arg(e, i, nb); cpy_arg2(e, i, nb); cpy_pos(e, i, nb); nb++; } i++; } e->a[nb].pos1 = e->a[nb - 1].pos2; e->a[nb].op = NULL; }
int main(int argc, char **argv) { unsigned char macaddr[6] = { 0, 0, 0, 0xa, 0xb, 0x0 }; uint16_t *macaddr_low = (uint16_t *) (macaddr + 2); struct pico_device *dev = NULL; struct option long_options[] = { {"help", 0, 0, 'h'}, {"vde", 1, 0, 'v'}, {"barevde", 1, 0, 'b'}, {"tun", 1, 0, 't'}, {"route", 1, 0, 'r'}, {"app", 1, 0, 'a'}, {"loop", 0, 0, 'l'}, {0, 0, 0, 0} }; int option_idx = 0; int c; *macaddr_low ^= (uint16_t)getpid(); printf("My macaddr base is: %02x %02x\n", macaddr[2], macaddr[3]); pico_stack_init(); /* Parse args */ while(1) { c = getopt_long(argc, argv, "v:b:t:a:r:hl", long_options, &option_idx); if (c < 0) break; switch(c) { case 'v': { char *nxt, *name = NULL, *sock = NULL, *addr = NULL, *nm = NULL, *gw = NULL; struct pico_ip4 ipaddr, netmask, gateway, zero = ZERO_IP4; printf("+++ OPTARG %s\n", optarg); do { nxt = cpy_arg(&name, optarg); if (!nxt) break; nxt = cpy_arg(&sock, nxt); if (!nxt) break; nxt = cpy_arg(&addr, nxt); if (!nxt) break; nxt = cpy_arg(&nm, nxt); if (!nxt) break; nxt = cpy_arg(&gw, nxt); } while(0); if (!nm) { fprintf(stderr, "Vde: bad configuration...\n"); exit(1); } dev = pico_vde_create(sock, name, macaddr); NXT_MAC(macaddr); if (!dev) { perror("Creating vde"); exit(1); } printf("Vde created.\n"); pico_string_to_ipv4(addr, &ipaddr.addr); pico_string_to_ipv4(nm, &netmask.addr); pico_ipv4_link_add(dev, ipaddr, netmask); /* bcastAddr.addr = (ipaddr.addr) | (~netmask.addr); */ if (gw && *gw) { pico_string_to_ipv4(gw, &gateway.addr); pico_ipv4_route_add(zero, zero, gateway, 1, NULL); } } break; } } if( pico_http_server_start(0, serverWakeup) < 0) { fprintf(stderr, "Unable to start the HTTP server on port 80\n"); } else { printf("HTTP server started\n"); } printf("%s: launching PicoTCP loop\n", __FUNCTION__); while(1) { pico_stack_tick(); usleep(2000); } }
void app_mcastsend_ipv6(char *arg) { char *maddr = NULL, *laddr = NULL, *lport = NULL, *sport = NULL; uint16_t sendto_port = 0; struct pico_ip6 inaddr_link = { 0 }, inaddr_mcast = { 0 }; char *new_arg = NULL, *p = NULL, *nxt = arg; struct pico_ip_mreq mreq = ZERO_MREQ_IP6; /* start of parameter parsing */ if (nxt) { nxt = cpy_arg(&laddr, nxt); if (laddr) { pico_string_to_ipv6(laddr, &inaddr_link.addr); } else { goto out; } } else { /* no arguments */ goto out; } if (nxt) { nxt = cpy_arg(&maddr, nxt); if (maddr) { pico_string_to_ipv6(maddr, &inaddr_mcast.addr); } else { goto out; } } else { /* missing multicast address */ goto out; } if (nxt) { nxt = cpy_arg(&sport, nxt); if (sport && atoi(sport)) { sendto_port = short_be(atoi(sport)); } else { /* incorrect send_port */ goto out; } } else { /* missing send_port */ goto out; } if (nxt) { nxt = cpy_arg(&lport, nxt); if (lport && atoi(lport)) { /* unused at this moment */ /* listen_port = short_be(atoi(lport)); */ } else { /* incorrect listen_port */ goto out; } } else { /* missing listen_port */ goto out; } picoapp_dbg("\n%s: mcastsend started. Sending packets to %s:%u\n\n", __FUNCTION__, maddr, short_be(sendto_port)); /* udpclient:dest_addr:sendto_port[:listen_port:datasize:loops:subloops] */ new_arg = calloc(1, strlen(maddr) + 1 + strlen(sport) + 1 + strlen(lport) + strlen(",64,10,5,") + 1); p = strcat(new_arg, maddr); p = strcat(p + strlen(maddr), ","); p = strcat(p + 1, sport); p = strcat(p + strlen(sport), ","); p = strcat(p + 1, lport); p = strcat(p + strlen(lport), ",64,10,5,"); /* DAD needs to verify the link address before we can continue */ while(!pico_ipv6_link_get(&inaddr_link) ) { pico_stack_tick(); usleep(2000); } app_udpclient(new_arg); memcpy(&mreq.mcast_group_addr,&inaddr_mcast, sizeof(struct pico_ip6)); memcpy(&mreq.mcast_link_addr ,&inaddr_link, sizeof(struct pico_ip6)); if(pico_socket_setoption(udpclient_pas->s, PICO_IP_ADD_MEMBERSHIP, &mreq) < 0) { picoapp_dbg("%s: socket_setoption PICO_IP_ADD_MEMBERSHIP failed: %s\n", __FUNCTION__, strerror(pico_err)); exit(1); } return; out: picoapp_dbg("mcastsend expects the following format: mcastsend:link_addr:mcast_addr:sendto_port:listen_port\n"); exit(255); }
void app_mcastsend(char *arg) { char *maddr = NULL, *laddr = NULL, *lport = NULL, *sport = NULL; uint16_t sendto_port = 0; struct pico_ip4 inaddr_link = { 0 }, inaddr_mcast = { 0 }; char *new_arg = NULL, *p = NULL, *nxt = arg; struct pico_ip_mreq mreq = ZERO_MREQ; /* start of parameter parsing */ if (nxt) { nxt = cpy_arg(&laddr, nxt); if (laddr) { pico_string_to_ipv4(laddr, &inaddr_link.addr); } else { goto out; } } else { /* no arguments */ goto out; } if (nxt) { nxt = cpy_arg(&maddr, nxt); if (maddr) { pico_string_to_ipv4(maddr, &inaddr_mcast.addr); } else { goto out; } } else { /* missing multicast address */ goto out; } if (nxt) { nxt = cpy_arg(&sport, nxt); if (sport && atoi(sport)) { sendto_port = short_be(atoi(sport)); } else { /* incorrect send_port */ goto out; } } else { /* missing send_port */ goto out; } if (nxt) { nxt = cpy_arg(&lport, nxt); if (lport && atoi(lport)) { /* unused at this moment */ /* listen_port = short_be(atoi(lport)); */ } else { /* incorrect listen_port */ goto out; } } else { /* missing listen_port */ goto out; } picoapp_dbg("\n%s: mcastsend started. Sending packets to %08X:%u\n\n", __FUNCTION__, long_be(inaddr_mcast.addr), short_be(sendto_port)); /* udpclient:dest_addr:sendto_port[:listen_port:datasize:loops:subloops] */ new_arg = calloc(1, strlen(maddr) + 1 + strlen(sport) + 1 + strlen(lport) + strlen(":64:10:5:") + 1); p = strcat(new_arg, maddr); p = strcat(p + strlen(maddr), ":"); p = strcat(p + 1, sport); p = strcat(p + strlen(sport), ":"); p = strcat(p + 1, lport); p = strcat(p + strlen(lport), ":64:10:5:"); app_udpclient(new_arg); mreq.mcast_group_addr = inaddr_mcast; mreq.mcast_link_addr = inaddr_link; if(pico_socket_setoption(udpclient_pas->s, PICO_IP_ADD_MEMBERSHIP, &mreq) < 0) { picoapp_dbg("%s: socket_setoption PICO_IP_ADD_MEMBERSHIP failed: %s\n", __FUNCTION__, strerror(pico_err)); exit(1); } return; out: picoapp_dbg("mcastsend expects the following format: mcastsend:link_addr:mcast_addr:sendto_port:listen_port\n"); exit(255); }
void app_tftp(char *arg) { char *nxt; char *mode, *addr, *file; int tftp_mode; struct pico_ip4 server; nxt = cpy_arg(&mode, arg); if ((*mode == 's') || (*mode == 'c') || (*mode == 'p')) { /* TEST BENCH SEND MODE */ if (*mode == 's') { tftp_mode = TFTP_MODE_SRV; printf("tftp> Server\n"); } else { if (*mode == 'c') tftp_mode = TFTP_MODE_CLI; if (*mode == 'p') tftp_mode = TFTP_MODE_PSH; printf("tftp> Client\n"); if (!nxt) { printf("Usage: tftp:client:host:file:\n"); exit(1); } nxt = cpy_arg(&addr, nxt); if (pico_string_to_ipv4(addr, &server.addr) < 0) { printf("invalid host %s\n", addr); exit(1); } if (!nxt) { printf("Usage: tftp:client:host:file:\n"); exit(1); } nxt = cpy_arg(&file, nxt); } } else { printf("Usage: tftp:tx|rx|p:...\n"); } if (tftp_mode == TFTP_MODE_SRV) { pico_tftp_listen(PICO_PROTO_IPV4, tftp_listen_cb); } else if (tftp_mode == TFTP_MODE_CLI) { if(pico_tftp_start_rx((union pico_address *)&server, short_be(PICO_TFTP_PORT), PICO_PROTO_IPV4, file, cb_tftp) < 0) { fprintf(stderr, "TFTP: Error in initialization\n"); exit(1); } } else if (tftp_mode == TFTP_MODE_PSH) { if(pico_tftp_start_tx((union pico_address *)&server, short_be(PICO_TFTP_PORT), PICO_PROTO_IPV4, file, cb_tftp_tx) < 0) { fprintf(stderr, "TFTP: Error in initialization\n"); exit(1); } } else { printf("Usage: tftp:tx|rx|p:...\n"); } }