20,30 → 20,17 |
#include <stdio.h> |
#include <stdbool.h> |
#include <stdint.h> |
#include <inttypes.h> |
#include <limits.h> |
#include <stdlib.h> |
#include <stddef.h> |
#include <string.h> |
#include <unistd.h> |
#include <sys/types.h> |
#include <sys/select.h> |
#include <sys/stat.h> |
#include <fcntl.h> |
#include <assert.h> |
#include <time.h> |
#include <fcntl.h> |
#include <sys/socket.h> |
#include <sys/types.h> |
#include <netinet/in.h> |
#include <arpa/inet.h> |
#include <errno.h> |
|
#include "getopt.h" |
#include "vdisk.h" |
#include "vnet.h" |
#include "umka.h" |
#include "trace.h" |
#include "pci.h" |
#include "util.h" |
#include "lodepng.h" |
|
#define PATH_MAX 4096 |
207,29 → 194,11 |
} |
|
static int |
next_line(int is_tty, int block) { |
next_line(int is_tty) { |
if (is_tty) { |
prompt(); |
} |
if (block) { |
return fgets(cmd_buf, FGETS_BUF_LEN, fin) != NULL; |
} else { |
fd_set readfds; |
// FD_ZERO(&readfds); |
memset(&readfds, 0, sizeof(readfds)); |
FD_SET(fileno(fin), &readfds); |
struct timeval timeout = {.tv_sec = 0, .tv_usec = 0}; |
int sr = select(fileno(fin)+1, &readfds, NULL, NULL, &timeout); |
if (sr > 0) { |
fgets(cmd_buf, FGETS_BUF_LEN, fin); |
if (cmd_buf[0] == EOF) { |
cmd_buf[0] = '\0'; |
} |
} else { |
cmd_buf[0] = '\0'; |
} |
return 1; |
} |
return fgets(cmd_buf, FGETS_BUF_LEN, fin) != NULL; |
} |
|
static int |
1836,661 → 1805,6 |
} |
|
static void |
shell_stack_init(int argc, char **argv) { |
const char *usage = \ |
"usage: stack_init"; |
if (argc != 1) { |
fputs(usage, fout); |
return; |
} |
(void)argv; |
umka_stack_init(); |
} |
|
static void |
shell_net_add_device(int argc, char **argv) { |
const char *usage = \ |
"usage: net_add_device"; |
if (argc != 1) { |
fputs(usage, fout); |
return; |
} |
(void)argv; |
net_device_t *vnet = vnet_init(42); // FIXME: tap & list like block devices |
int32_t dev_num = kos_net_add_device(vnet); |
fprintf(fout, "device number: %" PRIi32 "\n", dev_num); |
} |
|
static void |
shell_net_get_dev_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_dev_count"; |
if (argc != 1) { |
fputs(usage, fout); |
return; |
} |
(void)argv; |
uint32_t count = umka_sys_net_get_dev_count(); |
fprintf(fout, "active network devices: %u\n", count); |
} |
|
static void |
shell_net_get_dev_type(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_dev_type <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
int32_t dev_type = umka_sys_net_get_dev_type(dev_num); |
fprintf(fout, "status: %s\n", dev_type == -1 ? "fail" : "ok"); |
if (dev_type != -1) { |
fprintf(fout, "type of network device #%" PRIu8 ": %i\n", |
dev_num, dev_type); |
} |
} |
|
static void |
shell_net_get_dev_name(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_dev_name <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
char dev_name[64]; |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
int32_t status = umka_sys_net_get_dev_name(dev_num, dev_name); |
fprintf(fout, "status: %s\n", status == -1 ? "fail" : "ok"); |
if (status != -1) { |
fprintf(fout, "name of network device #%" PRIu8 ": %s\n", |
dev_num, dev_name); |
} |
} |
|
static void |
shell_net_dev_reset(int argc, char **argv) { |
const char *usage = \ |
"usage: net_dev_reset <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
int32_t status = umka_sys_net_dev_reset(dev_num); |
fprintf(fout, "status: %s\n", status == -1 ? "fail" : "ok"); |
} |
|
static void |
shell_net_dev_stop(int argc, char **argv) { |
const char *usage = \ |
"usage: net_dev_stop <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
int32_t status = umka_sys_net_dev_stop(dev_num); |
fprintf(fout, "status: %s\n", status == -1 ? "fail" : "ok"); |
} |
|
static void |
shell_net_get_dev(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_dev <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
intptr_t dev = umka_sys_net_get_dev(dev_num); |
fprintf(fout, "status: %s\n", dev == -1 ? "fail" : "ok"); |
if (dev != -1) { |
fprintf(fout, "address of net dev #%" PRIu8 ": 0x%x\n", dev_num, dev); |
} |
} |
|
static void |
shell_net_get_packet_tx_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_packet_tx_count <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t count = umka_sys_net_get_packet_tx_count(dev_num); |
fprintf(fout, "status: %s\n", count == UINT32_MAX ? "fail" : "ok"); |
if (count != UINT32_MAX) { |
fprintf(fout, "packet tx count of net dev #%" PRIu8 ": %" PRIu32 "\n", |
dev_num, count); |
} |
} |
|
static void |
shell_net_get_packet_rx_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_packet_rx_count <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t count = umka_sys_net_get_packet_rx_count(dev_num); |
fprintf(fout, "status: %s\n", count == UINT32_MAX ? "fail" : "ok"); |
if (count != UINT32_MAX) { |
fprintf(fout, "packet rx count of net dev #%" PRIu8 ": %" PRIu32 "\n", |
dev_num, count); |
} |
} |
|
static void |
shell_net_get_byte_tx_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_byte_tx_count <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t count = umka_sys_net_get_byte_tx_count(dev_num); |
fprintf(fout, "status: %s\n", count == UINT32_MAX ? "fail" : "ok"); |
if (count != UINT32_MAX) { |
fprintf(fout, "byte tx count of net dev #%" PRIu8 ": %" PRIu32 "\n", |
dev_num, count); |
} |
} |
|
static void |
shell_net_get_byte_rx_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_byte_rx_count <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t count = umka_sys_net_get_byte_rx_count(dev_num); |
fprintf(fout, "status: %s\n", count == UINT32_MAX ? "fail" : "ok"); |
if (count != UINT32_MAX) { |
fprintf(fout, "byte rx count of net dev #%" PRIu8 ": %" PRIu32 "\n", |
dev_num, count); |
} |
} |
|
static void |
print_link_status_names(uint32_t status) { |
switch (status & 0x3) { |
case ETH_LINK_DOWN: |
fprintf(fout, "ETH_LINK_DOWN"); |
break; |
case ETH_LINK_UNKNOWN: |
fprintf(fout, "ETH_LINK_UNKNOWN"); |
break; |
case ETH_LINK_FD: |
fprintf(fout, "ETH_LINK_FD"); |
break; |
default: |
fprintf(fout, "ERROR"); |
break; |
} |
|
switch(status & ~3u) { |
case ETH_LINK_1G: |
fprintf(fout, " + ETH_LINK_1G"); |
break; |
case ETH_LINK_100M: |
fprintf(fout, " + ETH_LINK_100M"); |
break; |
case ETH_LINK_10M: |
fprintf(fout, " + ETH_LINK_10M"); |
break; |
default: |
fprintf(fout, " + UNKNOWN"); |
break; |
} |
} |
|
static void |
shell_net_get_link_status(int argc, char **argv) { |
const char *usage = \ |
"usage: net_get_link_status <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint8_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t status = umka_sys_net_get_link_status(dev_num); |
fprintf(fout, "status: %s\n", status == UINT32_MAX ? "fail" : "ok"); |
if (status != UINT32_MAX) { |
fprintf(fout, "link status of net dev #%" PRIu8 ": %" PRIu32 " ", |
dev_num, status); |
print_link_status_names(status); |
putchar('\n'); |
} |
} |
|
static void |
shell_net_open_socket(int argc, char **argv) { |
const char *usage = \ |
"usage: net_open_socket <domain> <type> <protocol>\n" |
" domain domain\n" |
" type type\n" |
" protocol protocol"; |
if (argc != 4) { |
fputs(usage, fout); |
return; |
} |
uint32_t domain = strtoul(argv[1], NULL, 0); |
uint32_t type = strtoul(argv[2], NULL, 0); |
uint32_t protocol = strtoul(argv[3], NULL, 0); |
f75ret_t r = umka_sys_net_open_socket(domain, type, protocol); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
// UINT32_MAX |
} |
|
static void |
shell_net_close_socket(int argc, char **argv) { |
const char *usage = \ |
"usage: net_close_socket <socket number>\n" |
" socket number socket number"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t fd = strtoul(argv[1], NULL, 0); |
f75ret_t r = umka_sys_net_close_socket(fd); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
} |
|
static void |
shell_net_bind(int argc, char **argv) { |
const char *usage = \ |
"usage: net_bind <fd> <port> <ip>\n" |
" fd socket number\n" |
" port port\n" |
" addr addr"; |
if (argc != 4) { |
fputs(usage, fout); |
return; |
} |
uint32_t fd = strtoul(argv[1], NULL, 0); |
uint16_t port = strtoul(argv[2], NULL, 0); |
char *addr_str = argv[3]; |
uint32_t addr = inet_addr(addr_str); |
struct sockaddr_in sa; |
memset(&sa, 0, sizeof(sa)); |
sa.sin_family = AF_INET4; |
sa.sin_port = htons(port); |
sa.sin_addr.s_addr = addr; |
fprintf(fout, "sockaddr at %p\n", (void*)&sa); |
f75ret_t r = umka_sys_net_bind(fd, &sa, sizeof(struct sockaddr_in)); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
} |
|
static void |
shell_net_listen(int argc, char **argv) { |
const char *usage = \ |
"usage: net_listen <fd> <backlog>\n" |
" fd socket number\n" |
" backlog max queue length"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t fd = strtoul(argv[1], NULL, 0); |
uint32_t backlog = strtoul(argv[2], NULL, 0); |
f75ret_t r = umka_sys_net_listen(fd, backlog); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
} |
|
static void |
shell_net_connect(int argc, char **argv) { |
const char *usage = \ |
"usage: net_connect <fd> <port> <ip>\n" |
" fd socket number\n" |
" port port\n" |
" addr addr"; |
if (argc != 4) { |
fputs(usage, fout); |
return; |
} |
uint32_t fd = strtoul(argv[1], NULL, 0); |
uint16_t port = strtoul(argv[2], NULL, 0); |
char *addr_str = argv[3]; |
uint32_t addr = inet_addr(addr_str); |
struct sockaddr_in sa; |
memset(&sa, 0, sizeof(sa)); |
sa.sin_family = AF_INET4; |
sa.sin_port = htons(port); |
sa.sin_addr.s_addr = addr; |
fprintf(fout, "sockaddr at %p\n", (void*)&sa); |
f75ret_t r = umka_sys_net_connect(fd, &sa, sizeof(struct sockaddr_in)); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
} |
|
static void |
shell_net_accept(int argc, char **argv) { |
const char *usage = \ |
"usage: net_accept <fd> <port> <ip>\n" |
" fd socket number\n" |
" port port\n" |
" addr addr"; |
if (argc != 4) { |
fputs(usage, fout); |
return; |
} |
uint32_t fd = strtoul(argv[1], NULL, 0); |
uint16_t port = strtoul(argv[2], NULL, 0); |
char *addr_str = argv[3]; |
uint32_t addr = inet_addr(addr_str); |
struct sockaddr_in sa; |
memset(&sa, 0, sizeof(sa)); |
sa.sin_family = AF_INET4; |
sa.sin_port = htons(port); |
sa.sin_addr.s_addr = addr; |
fprintf(fout, "sockaddr at %p\n", (void*)&sa); |
f75ret_t r = umka_sys_net_accept(fd, &sa, sizeof(struct sockaddr_in)); |
fprintf(fout, "value: 0x%" PRIx32 "\n", r.value); |
fprintf(fout, "errorcode: 0x%" PRIx32 "\n", r.errorcode); |
} |
|
static void |
shell_net_eth_read_mac(int argc, char **argv) { |
const char *usage = \ |
"usage: net_eth_read_mac <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_eth_read_mac(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", |
(uint8_t)(r.ebx >> 0), (uint8_t)(r.ebx >> 8), |
(uint8_t)(r.eax >> 0), (uint8_t)(r.eax >> 8), |
(uint8_t)(r.eax >> 16), (uint8_t)(r.eax >> 24)); |
} |
} |
|
static void |
shell_net_ipv4_get_addr(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_get_addr <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_ipv4_get_addr(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%d.%d.%d.%d\n", |
(uint8_t)(r.eax >> 0), (uint8_t)(r.eax >> 8), |
(uint8_t)(r.eax >> 16), (uint8_t)(r.eax >> 24)); |
} |
} |
|
static void |
shell_net_ipv4_set_addr(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_set_addr <dev_num> <addr>\n" |
" dev_num device number as returned by net_add_device\n" |
" addr a.b.c.d"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
char *addr_str = argv[2]; |
uint32_t addr = inet_addr(addr_str); |
f76ret_t r = umka_sys_net_ipv4_set_addr(dev_num, addr); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "status: ok\n"); |
} |
} |
|
static void |
shell_net_ipv4_get_dns(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_get_dns <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_ipv4_get_dns(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%d.%d.%d.%d\n", |
(uint8_t)(r.eax >> 0), (uint8_t)(r.eax >> 8), |
(uint8_t)(r.eax >> 16), (uint8_t)(r.eax >> 24)); |
} |
} |
|
static void |
shell_net_ipv4_set_dns(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_set_dns <dev_num> <dns>\n" |
" dev_num device number as returned by net_add_device\n" |
" dns a.b.c.d"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t dns = inet_addr(argv[2]); |
f76ret_t r = umka_sys_net_ipv4_set_dns(dev_num, dns); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "status: ok\n"); |
} |
} |
|
static void |
shell_net_ipv4_get_subnet(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_get_subnet <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_ipv4_get_subnet(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%d.%d.%d.%d\n", |
(uint8_t)(r.eax >> 0), (uint8_t)(r.eax >> 8), |
(uint8_t)(r.eax >> 16), (uint8_t)(r.eax >> 24)); |
} |
} |
|
static void |
shell_net_ipv4_set_subnet(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_set_subnet <dev_num> <subnet>\n" |
" dev_num device number as returned by net_add_device\n" |
" subnet a.b.c.d"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
char *subnet_str = argv[2]; |
uint32_t subnet = inet_addr(subnet_str); |
f76ret_t r = umka_sys_net_ipv4_set_subnet(dev_num, subnet); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "status: ok\n"); |
} |
} |
|
static void |
shell_net_ipv4_get_gw(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_get_gw <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_ipv4_get_gw(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%d.%d.%d.%d\n", |
(uint8_t)(r.eax >> 0), (uint8_t)(r.eax >> 8), |
(uint8_t)(r.eax >> 16), (uint8_t)(r.eax >> 24)); |
} |
} |
|
static void |
shell_net_ipv4_set_gw(int argc, char **argv) { |
const char *usage = \ |
"usage: net_ipv4_set_gw <dev_num> <gw>\n" |
" dev_num device number as returned by net_add_device\n" |
" gw a.b.c.d"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
char *gw_str = argv[2]; |
uint32_t gw = inet_addr(gw_str); |
f76ret_t r = umka_sys_net_ipv4_set_gw(dev_num, gw); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "status: ok\n"); |
} |
} |
|
static void |
shell_net_arp_get_count(int argc, char **argv) { |
const char *usage = \ |
"usage: net_arp_get_count <dev_num>\n" |
" dev_num device number as returned by net_add_device"; |
if (argc != 2) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
f76ret_t r = umka_sys_net_arp_get_count(dev_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "%" PRIi32 "\n", r.eax); |
} |
} |
|
static void |
shell_net_arp_get_entry(int argc, char **argv) { |
const char *usage = \ |
"usage: net_arp_get_entry <dev_num> <arp_num>\n" |
" dev_num device number as returned by net_add_device\n" |
" arp_num arp number as returned by net_add_device"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
uint32_t arp_num = strtoul(argv[2], NULL, 0); |
arp_entry_t arp; |
f76ret_t r = umka_sys_net_arp_get_entry(dev_num, arp_num, &arp); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} else { |
fprintf(fout, "arp #%u: IP %d.%d.%d.%d, " |
"mac %2.2" SCNu8 ":%2.2" SCNu8 ":%2.2" SCNu8 |
":%2.2" SCNu8 ":%2.2" SCNu8 ":%2.2" SCNu8 ", " |
"status %" PRIu16 ", " |
"ttl %" PRIu16 "\n", |
arp_num, |
(uint8_t)(arp.ip >> 0), (uint8_t)(arp.ip >> 8), |
(uint8_t)(arp.ip >> 16), (uint8_t)(arp.ip >> 24), |
arp.mac[0], arp.mac[1], arp.mac[2], |
arp.mac[3], arp.mac[4], arp.mac[5], |
arp.status, arp.ttl); |
} |
} |
|
static void |
shell_net_arp_add_entry(int argc, char **argv) { |
const char *usage = \ |
"usage: net_arp_add_entry <dev_num> <addr> <mac> <status> <ttl>\n" |
" dev_num device number as returned by net_add_device\n" |
" addr IP addr\n" |
" mac ethernet addr\n" |
" status see ARP.inc\n" |
" ttl Time to live"; |
if (argc != 6) { |
fputs(usage, fout); |
return; |
} |
arp_entry_t arp; |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
arp.ip = inet_addr(argv[2]); |
sscanf(argv[3], "%" SCNu8 ":%" SCNu8 ":%" SCNu8 |
":%" SCNu8 ":%" SCNu8 ":%" SCNu8, |
arp.mac+0, arp.mac+1, arp.mac+2, |
arp.mac+3, arp.mac+4, arp.mac+5); |
arp.status = strtoul(argv[4], NULL, 0); |
arp.ttl = strtoul(argv[5], NULL, 0); |
f76ret_t r = umka_sys_net_arp_add_entry(dev_num, &arp); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} |
} |
|
static void |
shell_net_arp_del_entry(int argc, char **argv) { |
const char *usage = \ |
"usage: net_arp_del_entry <dev_num> <arp_num>\n" |
" dev_num device number as returned by net_add_device\n" |
" arp_num arp number as returned by net_add_device"; |
if (argc != 3) { |
fputs(usage, fout); |
return; |
} |
uint32_t dev_num = strtoul(argv[1], NULL, 0); |
int32_t arp_num = strtoul(argv[2], NULL, 0); |
f76ret_t r = umka_sys_net_arp_del_entry(dev_num, arp_num); |
if (r.eax == UINT32_MAX) { |
fprintf(fout, "status: fail\n"); |
} |
} |
|
static void |
shell_bg_set_size(int argc, char **argv) { |
const char *usage = \ |
"usage: bg_set_size <xsize> <ysize>\n" |
2635,37 → 1949,6 |
{ "ls80", shell_ls80 }, |
{ "move_window", shell_move_window }, |
{ "mouse_move", shell_mouse_move }, |
{ "net_accept", shell_net_accept }, |
{ "net_add_device", shell_net_add_device }, |
{ "net_arp_add_entry", shell_net_arp_add_entry }, |
{ "net_arp_del_entry", shell_net_arp_del_entry }, |
{ "net_arp_get_count", shell_net_arp_get_count }, |
{ "net_arp_get_entry", shell_net_arp_get_entry }, |
{ "net_bind", shell_net_bind }, |
{ "net_close_socket", shell_net_close_socket }, |
{ "net_connect", shell_net_connect }, |
{ "net_dev_reset", shell_net_dev_reset }, |
{ "net_dev_stop", shell_net_dev_stop }, |
{ "net_eth_read_mac", shell_net_eth_read_mac }, |
{ "net_get_byte_rx_count", shell_net_get_byte_rx_count }, |
{ "net_get_byte_tx_count", shell_net_get_byte_tx_count }, |
{ "net_get_dev", shell_net_get_dev }, |
{ "net_get_dev_count", shell_net_get_dev_count }, |
{ "net_get_dev_name", shell_net_get_dev_name }, |
{ "net_get_dev_type", shell_net_get_dev_type }, |
{ "net_get_link_status", shell_net_get_link_status }, |
{ "net_get_packet_rx_count", shell_net_get_packet_rx_count }, |
{ "net_get_packet_tx_count", shell_net_get_packet_tx_count }, |
{ "net_ipv4_get_addr", shell_net_ipv4_get_addr }, |
{ "net_ipv4_get_dns", shell_net_ipv4_get_dns }, |
{ "net_ipv4_get_gw", shell_net_ipv4_get_gw }, |
{ "net_ipv4_get_subnet", shell_net_ipv4_get_subnet }, |
{ "net_ipv4_set_addr", shell_net_ipv4_set_addr }, |
{ "net_ipv4_set_dns", shell_net_ipv4_set_dns }, |
{ "net_ipv4_set_gw", shell_net_ipv4_set_gw }, |
{ "net_ipv4_set_subnet", shell_net_ipv4_set_subnet }, |
{ "net_listen", shell_net_listen }, |
{ "net_open_socket", shell_net_open_socket }, |
{ "pci_get_path", shell_pci_get_path }, |
{ "pci_set_path", shell_pci_set_path }, |
{ "process_info", shell_process_info }, |
2685,7 → 1968,6 |
{ "set_skin", shell_set_skin }, |
{ "set_window_caption", shell_set_window_caption }, |
{ "set_window_colors", shell_set_window_colors }, |
{ "stack_init", shell_stack_init }, |
{ "stat70", shell_stat70 }, |
{ "stat80", shell_stat80 }, |
{ "window_redraw", shell_window_redraw }, |
2728,12 → 2010,12 |
} |
|
void * |
run_test(FILE *in, FILE *out, int block) { |
run_test(FILE *in, FILE *out) { |
fin = in; |
fout = out; |
int is_tty = isatty(fileno(fin)); |
int is_tty = 0; // isatty(fileno(fin)); |
char **argv = (char**)malloc(sizeof(char*) * (MAX_COMMAND_ARGS + 1)); |
while(next_line(is_tty, block)) { |
while(next_line(is_tty)) { |
if (cmd_buf[0] == '#' || cmd_buf[0] == '\n' || cmd_buf[0] == '\0' || |
cmd_buf[0] == '\r') { |
fprintf(fout, "%s", cmd_buf); |