#include "proto.h" #include "util.h" #include #include #include #include #include #include #include #include #include struct net_state state = {0}; void network_thread(void *arg) { (void)arg; const size_t buflen = 4096; char *buf = malloc(buflen); for (;;) { long ret = _sys_read(state.raw_h, buf, buflen, -1); if (ret < 0) break; ether_parse((void*)buf, ret); } free(buf); } void fs_thread(void *arg); int main(int argc, char **argv) { char *path; if (argc < 4) { fprintf(stderr, "usage: netstack iface ip gateway\n"); return 1; } if (asprintf(&path, "%s/net", argv[1]) < 0) { errx(1, "asprintf failed for some reason"); } state.raw_h = camellia_open(path, OPEN_RW); if (state.raw_h < 0) { err(1, "open %s", path); return 1; } free(path); if (asprintf(&path, "%s/mac", argv[1]) < 0) { errx(1, "asprintf failed for some reason"); } hid_t h = camellia_open(path, OPEN_READ); if (h < 0) { err(1, "open %s", path); return 1; } if (_sys_read(h, state.mac, 6, 0) != 6) { errx(1, "can't read mac", path); return 1; } _sys_close(h); free(path); if (ip_parse(argv[2], &state.ip) < 0) { errx(1, "invalid ip: %s", argv[2]); return 1; } if (ip_parse(argv[3], &state.gateway) < 0) { errx(1, "invalid gateway: %s", argv[3]); return 1; } setproctitle( "ip=%s gw=%s mac=%02x:%02x:%02x:%02x:%02x:%02x", argv[2], argv[3], state.mac[0], state.mac[1], state.mac[2], state.mac[3], state.mac[4], state.mac[5] ); arp_request(state.gateway); thread_create(0, network_thread, NULL); thread_create(0, fs_thread, NULL); _sys_await(); return 0; }