X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=nmrpd.h;h=c57ef9c415dc198bf129e2bc85fd0d6183ec71a0;hb=495891fb6b64825082a5d6baba886c4cc045b9dd;hp=125dc557c43b681916f49e36253561ca5bc86277;hpb=a6c40ee917965f38830b9f221436aa9afe8964e9;p=oweals%2Fnmrpflash.git diff --git a/nmrpd.h b/nmrpd.h index 125dc55..c57ef9c 100644 --- a/nmrpd.h +++ b/nmrpd.h @@ -20,17 +20,25 @@ #ifndef NMRPD_H #define NMRPD_H #include +#include #include #if defined(_WIN32) || defined(_WIN64) -#define NMRPFLASH_WINDOWS -#elif defined(__linux__) -#define NMRPFLASH_LINUX +# define NMRPFLASH_WINDOWS #elif defined(__APPLE__) && defined(__MACH__) -#define NMRPFLASH_OSX -#elif defined(__unix__) -#define NMRPFLASH_UNIX -#warning "nmrpflash is not fully supported on your operating system" +# define NMRPFLASH_OSX +# define NMRPFLASH_BSD +#elif defined (__unix__) +# define NMRPFLASH_UNIX +# if defined(__linux__) +# define NMRPFLASH_LINUX +# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) +# define NMRPFLASH_BSD +# else +# warning "nmrpflash is not fully supported on this platform" +# endif +#else +# warning "nmrpflash is not supported on this platform" #endif #ifndef NMRPFLASH_WINDOWS @@ -49,6 +57,20 @@ #include #endif +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#ifndef PACKED +#define PACKED __attribute__((packed)) +#endif + +struct eth_hdr { + uint8_t ether_dhost[6]; + uint8_t ether_shost[6]; + uint16_t ether_type; +} PACKED; + enum nmrp_op { NMRP_UPLOAD_FW = 0, NMRP_UPLOAD_ST = 1, @@ -61,16 +83,17 @@ struct nmrpd_args { const char *tftpcmd; const char *file_local; const char *file_remote; + const char *ipaddr_intf; const char *ipaddr; const char *ipmask; const char *intf; const char *mac; enum nmrp_op op; uint16_t port; - uint16_t region; - int force_root; + const char *region; }; +const char *leafname(const char *path); int tftp_put(struct nmrpd_args *args); bool tftp_is_valid_filename(const char *filename); @@ -83,12 +106,14 @@ const char *mac_to_str(uint8_t *mac); void win_perror2(const char *msg, DWORD err); void sock_perror(const char *msg); #else -#define sock_perror(x) perror(x) +#define sock_perror(x) xperror(x) #endif extern int verbosity; struct ethsock; +struct ethsock_arp_undo; +struct ethsock_ip_undo; struct ethsock *ethsock_create(const char *intf, uint16_t protocol); int ethsock_close(struct ethsock *sock); @@ -96,6 +121,29 @@ int ethsock_send(struct ethsock *sock, void *buf, size_t len); ssize_t ethsock_recv(struct ethsock *sock, void *buf, size_t len); int ethsock_set_timeout(struct ethsock *sock, unsigned msec); uint8_t *ethsock_get_hwaddr(struct ethsock *sock); +int ethsock_arp_add(struct ethsock *sock, uint8_t *hwaddr, uint32_t ipaddr, struct ethsock_arp_undo **undo); +int ethsock_arp_del(struct ethsock *sock, struct ethsock_arp_undo **undo); int ethsock_list_all(void); +struct ethsock_ip_callback_args +{ + struct in_addr *ipaddr; + struct in_addr *ipmask; + void *arg; +}; + +typedef int (*ethsock_ip_callback_t)(struct ethsock_ip_callback_args *args); +int ethsock_for_each_ip(struct ethsock *sock, ethsock_ip_callback_t callback, + void *arg); + +int ethsock_ip_add(struct ethsock *sock, uint32_t ipaddr, uint32_t ipmask, struct ethsock_ip_undo **undo); +int ethsock_ip_del(struct ethsock *sock, struct ethsock_ip_undo **undo); + +time_t time_monotonic(); +char *lltostr(long long ll, int base); +uint32_t bitcount(uint32_t n); +uint32_t netmask(uint32_t count); +void xperror(const char *msg); + +extern volatile sig_atomic_t g_interrupted; #endif