Skip to content

Commit 4ab91c2

Browse files
committed
move success and failure handler to main
1 parent bf11317 commit 4ab91c2

File tree

4 files changed

+82
-73
lines changed

4 files changed

+82
-73
lines changed

h3c.c

Lines changed: 64 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77

88
#include "h3c.h"
99

10-
extern int sockfd;
10+
static int sockfd;
1111

12-
extern char *interface;
13-
extern char *username;
14-
extern char *password;
12+
static char *interface;
13+
static char *username;
14+
static char *password;
1515

16-
extern unsigned char send_buf[BUF_LEN];
17-
extern unsigned char recv_buf[BUF_LEN];
16+
static unsigned char send_buf[BUF_LEN];
17+
static unsigned char recv_buf[BUF_LEN];
1818

19-
extern struct sockaddr_ll addr;
19+
static struct sockaddr_ll addr;
2020

2121
void h3c_set_eapol_header(unsigned char type, unsigned short p_len)
2222
{
@@ -40,58 +40,65 @@ void h3c_set_eap_header(unsigned char code, unsigned char id, \
4040
pkt->eap_header.type = type;
4141
}
4242

43-
void h3c_init()
43+
int h3c_init(char *_interface, char *_username, char *_password)
4444
{
4545
struct ifreq ifr;
4646
struct packet *pkt;
4747
pkt = (struct packet *)send_buf;
4848

49+
interface = _interface;
50+
username = _username;
51+
password = _password;
52+
4953
sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_PAE));
5054
if (-1 == sockfd)
51-
exit(errno);
55+
return -1;
5256

5357
memcpy(pkt->eth_header.ether_dhost,PAE_GROUP_ADDR,ETH_ALEN);
5458

5559
strcpy(ifr.ifr_name, interface);
5660
if (-1 == ioctl(sockfd, SIOCGIFHWADDR, &ifr))
57-
exit(errno);
61+
return -1;
5862

5963
memcpy(pkt->eth_header.ether_shost,ifr.ifr_hwaddr.sa_data,ETH_ALEN);
6064

6165
if(-1 == ioctl(sockfd,SIOCGIFINDEX,&ifr))
62-
exit(errno);
66+
return -1;
6367

6468
addr.sll_ifindex = ifr.ifr_ifindex;
6569

6670
/*
6771
* use htons when the data is more than 1 byte
6872
*/
6973
pkt->eth_header.ether_type = htons(ETH_P_PAE);
74+
75+
return 0;
7076
}
7177

72-
void h3c_start()
78+
int h3c_start()
7379
{
7480
h3c_set_eapol_header(EAPOL_START, 0);
7581

76-
if (-1 == sendto(sockfd, (void *)send_buf, sizeof(struct ether_header) + \
77-
sizeof(struct eapol), 0, (struct sockaddr*)&addr, sizeof(addr)))
78-
exit(errno);
82+
return sendto(sockfd, (void *)send_buf, \
83+
sizeof(struct ether_header)+ sizeof(struct eapol), 0, \
84+
(struct sockaddr*)&addr, sizeof(addr));
7985
}
8086

81-
void h3c_logoff()
87+
int h3c_logoff()
8288
{
8389
h3c_set_eapol_header(EAPOL_LOGOFF, 0);
8490

85-
if (-1 == sendto(sockfd, (void *)send_buf, sizeof(struct ether_header) + \
86-
sizeof(struct eapol), 0, (struct sockaddr*)&addr, sizeof(addr)))
87-
exit(errno);
91+
return sendto(sockfd, (void *)send_buf, \
92+
sizeof(struct ether_header) + sizeof(struct eapol), 0, \
93+
(struct sockaddr*)&addr, sizeof(addr));
8894
}
8995

90-
void h3c_send_id(unsigned char packet_id)
96+
int h3c_send_id(unsigned char packet_id)
9197
{
92-
unsigned short len = htons(sizeof(struct eap) + sizeof(VERSION_INFO) + \
93-
strlen(username));
94-
unsigned char *data = (unsigned char *)(send_buf + sizeof(struct packet));
98+
unsigned short len = htons(sizeof(struct eap) + \
99+
sizeof(VERSION_INFO) + strlen(username));
100+
unsigned char *data = \
101+
(unsigned char *)(send_buf + sizeof(struct packet));
95102

96103
h3c_set_eapol_header(EAPOL_EAPPACKET, len);
97104
h3c_set_eap_header(EAP_RESPONSE, packet_id, len, EAP_TYPE_ID);
@@ -101,17 +108,18 @@ void h3c_send_id(unsigned char packet_id)
101108
data += sizeof(VERSION_INFO);
102109
memcpy(data, username, strlen(username));
103110

104-
if (-1 == sendto(sockfd, (void *)send_buf, sizeof(struct packet) + \
111+
return sendto(sockfd, (void *)send_buf, sizeof(struct packet) + \
105112
sizeof(VERSION_INFO) + strlen(username), 0, \
106-
(struct sockaddr*)&addr, sizeof(addr)))
107-
exit(errno);
113+
(struct sockaddr*)&addr, sizeof(addr));
108114
}
109115

110-
void h3c_send_md5(unsigned char packet_id, unsigned char *md5data)
116+
int h3c_send_md5(unsigned char packet_id, unsigned char *md5data)
111117
{
112118
unsigned char md5[MD5_LEN];
113-
unsigned short len = htons(sizeof(struct eap) + 1 + MD5_LEN + strlen(username));
114-
unsigned char *data = (unsigned char *)(send_buf + sizeof(struct packet));
119+
unsigned short len = htons(sizeof(struct eap) + 1 + \
120+
MD5_LEN + strlen(username));
121+
unsigned char *data = \
122+
(unsigned char *)(send_buf + sizeof(struct packet));
115123

116124
memset(md5, 0, MD5_LEN);
117125
memcpy(md5, password, strlen(password));
@@ -130,18 +138,20 @@ void h3c_send_md5(unsigned char packet_id, unsigned char *md5data)
130138
data += MD5_LEN;
131139
memcpy(data, username, strlen(username));
132140

133-
if (-1 == sendto(sockfd, (void *)send_buf, sizeof(struct packet) + 1 + \
134-
MD5_LEN + strlen(username), 0, (struct sockaddr*)&addr, sizeof(addr)))
135-
exit(errno);
141+
return sendto(sockfd, (void *)send_buf, sizeof(struct packet) + \
142+
1 + MD5_LEN + strlen(username), 0, \
143+
(struct sockaddr*)&addr, sizeof(addr));
136144
}
137145

138-
void h3c_send_h3c(unsigned char packet_id)
146+
int h3c_send_h3c(unsigned char packet_id)
139147
{
140148
size_t password_size = strlen(password);
141149
size_t username_size = strlen(username);
142150

143-
unsigned short len = htons(sizeof(struct eap) + password_size + username_size);
144-
unsigned char *data = (unsigned char *)(send_buf + sizeof(struct packet));
151+
unsigned short len = htons(sizeof(struct eap) + password_size + \
152+
username_size);
153+
unsigned char *data = \
154+
(unsigned char *)(send_buf + sizeof(struct packet));
145155

146156
h3c_set_eapol_header(EAPOL_EAPPACKET, len);
147157
h3c_set_eap_header(EAP_RESPONSE, packet_id, len, EAP_TYPE_H3C);
@@ -154,12 +164,12 @@ void h3c_send_h3c(unsigned char packet_id)
154164
data += strlen(password);
155165
memcpy(data, username, username_size);
156166

157-
if (-1 == sendto(sockfd, (void *)send_buf, sizeof(struct packet) + 1 + \
158-
password_size + username_size, 0, (struct sockaddr*)&addr, sizeof(addr)))
159-
exit(errno);
167+
return sendto(sockfd, (void *)send_buf, sizeof(struct packet) + \
168+
1 + password_size + username_size, 0, \
169+
(struct sockaddr*)&addr, sizeof(addr));
160170
}
161171

162-
void h3c_response()
172+
int h3c_response(int (*success_callback)(), int (*failure_callback)())
163173
{
164174
struct packet *pkt;
165175
pkt = (struct packet *)recv_buf;
@@ -169,58 +179,62 @@ void h3c_response()
169179

170180
if (-1 == recvfrom(sockfd, (void *)recv_buf, BUF_LEN, 0, \
171181
(struct sockaddr *)&addr, &len))
172-
exit(errno);
182+
return -1;
173183

174184
if (pkt->eapol_header.type != EAPOL_EAPPACKET)
175185
{
176186
/*
177187
* Got unknown eapol type
178188
*/
179-
return;
189+
return 0;
180190
}
181191

182192
if (pkt->eap_header.code == EAP_SUCCESS)
183193
{
184194
/*
185195
* Got success
186-
* Go daemon
187-
* NOT always works on unix
188196
*/
189-
190-
daemon(0, 0);
197+
if (NULL != success_callback)
198+
return (*success_callback)();
199+
else
200+
return 0;
191201
}
192202
else if (pkt->eap_header.code == EAP_FAILURE)
193203
{
194204
/*
195205
* Got failure
196206
*/
197-
exit(-1);
207+
if (NULL != *failure_callback)
208+
return (*failure_callback)();
209+
else
210+
return 0;
198211
}
199212
else if (pkt->eap_header.code == EAP_REQUEST)
200213
{
201214
/*
202215
* Got request
203-
* Response according request type
216+
* Response according to request type
204217
*/
205218
if (pkt->eap_header.type == EAP_TYPE_ID)
206219
{
207-
h3c_send_id(pkt->eap_header.id);
220+
return h3c_send_id(pkt->eap_header.id);
208221
}
209222
else if (pkt->eap_header.type == EAP_TYPE_MD5)
210223
{
211224
unsigned char *md5;
212225
md5 = (unsigned char *)(recv_buf + sizeof(struct packet) + 1);
213-
h3c_send_md5(pkt->eap_header.id, md5);
226+
return h3c_send_md5(pkt->eap_header.id, md5);
214227
}
215228
else if (pkt->eap_header.type == EAP_TYPE_H3C)
216229
{
217-
h3c_send_h3c(pkt->eap_header.id);
230+
return h3c_send_h3c(pkt->eap_header.id);
218231
}
219232
}
220233
else if (pkt->eap_header.code == EAP_RESPONSE)
221234
{
222235
/*
223236
* Got response
224237
*/
238+
return 0;
225239
}
226240
}

h3c.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <stdio.h>
2020
#include <stdlib.h>
2121
#include <string.h>
22-
#include <errno.h>
2322
#include <unistd.h>
2423

2524
#define EAPOL_VERSION 1
@@ -74,18 +73,18 @@ void h3c_set_eapol_header(unsigned char type, unsigned short p_len);
7473
void h3c_set_eap_header(unsigned char code, unsigned char id, \
7574
unsigned short d_len, unsigned char type);
7675

77-
void h3c_init();
76+
int h3c_init(char *_interface, char *_username, char *_password);
7877

79-
void h3c_start();
78+
int h3c_start();
8079

81-
void h3c_logoff();
80+
int h3c_logoff();
8281

83-
void h3c_send_id(unsigned char packet_id);
82+
int h3c_response(int (*success_callback)(), int (*failure_callback)());
8483

85-
void h3c_send_md5(unsigned char packet_id, unsigned char *md5data);
84+
int h3c_send_id(unsigned char packet_id);
8685

87-
void h3c_send_h3c(unsigned char packet_id);
86+
int h3c_send_md5(unsigned char packet_id, unsigned char *md5data);
8887

89-
void h3c_response();
88+
int h3c_send_h3c(unsigned char packet_id);
9089

9190
#endif /* H3C_H_ */

h3c64

67 Bytes
Binary file not shown.

main.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77

88
#include "h3c.h"
99

10-
int sockfd;
11-
12-
char *interface;
13-
char *username;
14-
char *password;
15-
16-
unsigned char send_buf[BUF_LEN];
17-
unsigned char recv_buf[BUF_LEN];
10+
int success_handler()
11+
{
12+
printf("succeed\n");
13+
daemon(0, 0);
14+
}
1815

19-
struct sockaddr_ll addr;
16+
int failure_hander()
17+
{
18+
printf("failed\n");
19+
}
2020

2121
int main(int argc, char **argv)
2222
{
@@ -32,17 +32,13 @@ int main(int argc, char **argv)
3232
if (4 != argc)
3333
exit(-1);
3434

35-
interface = argv[1];
36-
username = argv[2];
37-
password = argv[3];
38-
39-
h3c_init();
35+
h3c_init(argv[1], argv[2], argv[3]);
4036

4137
h3c_start();
4238

4339
for(;;)
4440
{
45-
h3c_response();
41+
h3c_response(success_handler, failure_hander);
4642
}
4743

4844
return 0;

0 commit comments

Comments
 (0)