Exemple #1
0
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");
        }
    }
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}
Exemple #7
0
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);
}
Exemple #8
0
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");
    }
}