0eabf26e7cdfed96b45fe3965ebdf6905669b9cd
[oweals/nmrpflash.git] / nmrpd.h
1 /**
2  * nmrpflash - Netgear Unbrick Utility
3  * Copyright (C) 2016 Joseph Lehner <joseph.c.lehner@gmail.com>
4  *
5  * nmrpflash is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * nmrpflash is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with nmrpflash.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  */
19
20 #ifndef NMRPD_H
21 #define NMRPD_H
22 #include <stdint.h>
23 #include <stdbool.h>
24
25 #if defined(_WIN32) || defined(_WIN64)
26 #define NMRPFLASH_WINDOWS
27 #elif defined(__linux__)
28 #define NMRPFLASH_LINUX
29 #elif defined(__APPLE__) && defined(__MACH__)
30 #define NMRPFLASH_OSX
31 #elif defined(__unix__)
32 #define NMRPFLASH_UNIX
33 #warning "nmrpflash is not fully supported on your operating system"
34 #endif
35
36 #ifndef NMRPFLASH_WINDOWS
37 #include <arpa/inet.h>
38 #include <sys/types.h>
39 #include <sys/socket.h>
40 #include <netinet/in.h>
41 #include <net/if.h>
42 #ifndef NMRPFLASH_LINUX
43 #include <net/if_dl.h>
44 #endif
45 #else
46 #include <winsock2.h>
47 #include <iphlpapi.h>
48 #include <ws2tcpip.h>
49 #include <windows.h>
50 #endif
51
52 enum nmrp_op {
53         NMRP_UPLOAD_FW = 0,
54         NMRP_UPLOAD_ST = 1,
55         NMRP_SET_REGION = 2,
56 };
57
58 struct nmrpd_args {
59         unsigned rx_timeout;
60         unsigned ul_timeout;
61         const char *tftpcmd;
62         const char *file_local;
63         const char *file_remote;
64         const char *ipaddr;
65         const char *ipmask;
66         const char *intf;
67         const char *mac;
68         enum nmrp_op op;
69         uint16_t port;
70         uint16_t region;
71         int force_root;
72 };
73
74 int tftp_put(struct nmrpd_args *args);
75 bool tftp_is_valid_filename(const char *filename);
76
77 int nmrp_do(struct nmrpd_args *args);
78
79 int select_fd(int fd, unsigned timeout);
80 const char *mac_to_str(uint8_t *mac);
81
82 #ifdef NMRPFLASH_WINDOWS
83 void win_perror2(const char *msg, DWORD err);
84 void sock_perror(const char *msg);
85 #else
86 #define sock_perror(x) perror(x)
87 #endif
88
89 extern int verbosity;
90
91 struct ethsock;
92
93 struct ethsock *ethsock_create(const char *intf, uint16_t protocol);
94 int ethsock_close(struct ethsock *sock);
95 int ethsock_send(struct ethsock *sock, void *buf, size_t len);
96 ssize_t ethsock_recv(struct ethsock *sock, void *buf, size_t len);
97 int ethsock_set_timeout(struct ethsock *sock, unsigned msec);
98 uint8_t *ethsock_get_hwaddr(struct ethsock *sock);
99 int ethsock_list_all(void);
100
101 struct ethsock_ip_callback_args
102 {
103         struct in_addr *ipaddr;
104         struct in_addr *ipmask;
105         void *arg;
106 };
107
108 typedef int (*ethsock_ip_callback_t)(struct ethsock_ip_callback_args *args);
109 int ethsock_for_each_ip(struct ethsock *sock, ethsock_ip_callback_t callback,
110                 void *arg);
111 #endif