7
7
8
8
#include "h3c.h"
9
9
10
- extern int sockfd ;
10
+ static int sockfd ;
11
11
12
- extern char * interface ;
13
- extern char * username ;
14
- extern char * password ;
12
+ static char * interface ;
13
+ static char * username ;
14
+ static char * password ;
15
15
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 ];
18
18
19
- extern struct sockaddr_ll addr ;
19
+ static struct sockaddr_ll addr ;
20
20
21
21
void h3c_set_eapol_header (unsigned char type , unsigned short p_len )
22
22
{
@@ -40,58 +40,65 @@ void h3c_set_eap_header(unsigned char code, unsigned char id, \
40
40
pkt -> eap_header .type = type ;
41
41
}
42
42
43
- void h3c_init ()
43
+ int h3c_init (char * _interface , char * _username , char * _password )
44
44
{
45
45
struct ifreq ifr ;
46
46
struct packet * pkt ;
47
47
pkt = (struct packet * )send_buf ;
48
48
49
+ interface = _interface ;
50
+ username = _username ;
51
+ password = _password ;
52
+
49
53
sockfd = socket (PF_PACKET , SOCK_RAW , htons (ETH_P_PAE ));
50
54
if (-1 == sockfd )
51
- exit ( errno ) ;
55
+ return -1 ;
52
56
53
57
memcpy (pkt -> eth_header .ether_dhost ,PAE_GROUP_ADDR ,ETH_ALEN );
54
58
55
59
strcpy (ifr .ifr_name , interface );
56
60
if (-1 == ioctl (sockfd , SIOCGIFHWADDR , & ifr ))
57
- exit ( errno ) ;
61
+ return -1 ;
58
62
59
63
memcpy (pkt -> eth_header .ether_shost ,ifr .ifr_hwaddr .sa_data ,ETH_ALEN );
60
64
61
65
if (-1 == ioctl (sockfd ,SIOCGIFINDEX ,& ifr ))
62
- exit ( errno ) ;
66
+ return -1 ;
63
67
64
68
addr .sll_ifindex = ifr .ifr_ifindex ;
65
69
66
70
/*
67
71
* use htons when the data is more than 1 byte
68
72
*/
69
73
pkt -> eth_header .ether_type = htons (ETH_P_PAE );
74
+
75
+ return 0 ;
70
76
}
71
77
72
- void h3c_start ()
78
+ int h3c_start ()
73
79
{
74
80
h3c_set_eapol_header (EAPOL_START , 0 );
75
81
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 ) );
79
85
}
80
86
81
- void h3c_logoff ()
87
+ int h3c_logoff ()
82
88
{
83
89
h3c_set_eapol_header (EAPOL_LOGOFF , 0 );
84
90
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 ) );
88
94
}
89
95
90
- void h3c_send_id (unsigned char packet_id )
96
+ int h3c_send_id (unsigned char packet_id )
91
97
{
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 ));
95
102
96
103
h3c_set_eapol_header (EAPOL_EAPPACKET , len );
97
104
h3c_set_eap_header (EAP_RESPONSE , packet_id , len , EAP_TYPE_ID );
@@ -101,17 +108,18 @@ void h3c_send_id(unsigned char packet_id)
101
108
data += sizeof (VERSION_INFO );
102
109
memcpy (data , username , strlen (username ));
103
110
104
- if ( -1 == sendto (sockfd , (void * )send_buf , sizeof (struct packet ) + \
111
+ return sendto (sockfd , (void * )send_buf , sizeof (struct packet ) + \
105
112
sizeof (VERSION_INFO ) + strlen (username ), 0 , \
106
- (struct sockaddr * )& addr , sizeof (addr )))
107
- exit (errno );
113
+ (struct sockaddr * )& addr , sizeof (addr ));
108
114
}
109
115
110
- void h3c_send_md5 (unsigned char packet_id , unsigned char * md5data )
116
+ int h3c_send_md5 (unsigned char packet_id , unsigned char * md5data )
111
117
{
112
118
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 ));
115
123
116
124
memset (md5 , 0 , MD5_LEN );
117
125
memcpy (md5 , password , strlen (password ));
@@ -130,18 +138,20 @@ void h3c_send_md5(unsigned char packet_id, unsigned char *md5data)
130
138
data += MD5_LEN ;
131
139
memcpy (data , username , strlen (username ));
132
140
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 ) );
136
144
}
137
145
138
- void h3c_send_h3c (unsigned char packet_id )
146
+ int h3c_send_h3c (unsigned char packet_id )
139
147
{
140
148
size_t password_size = strlen (password );
141
149
size_t username_size = strlen (username );
142
150
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 ));
145
155
146
156
h3c_set_eapol_header (EAPOL_EAPPACKET , len );
147
157
h3c_set_eap_header (EAP_RESPONSE , packet_id , len , EAP_TYPE_H3C );
@@ -154,12 +164,12 @@ void h3c_send_h3c(unsigned char packet_id)
154
164
data += strlen (password );
155
165
memcpy (data , username , username_size );
156
166
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 ) );
160
170
}
161
171
162
- void h3c_response ()
172
+ int h3c_response (int ( * success_callback )(), int ( * failure_callback )() )
163
173
{
164
174
struct packet * pkt ;
165
175
pkt = (struct packet * )recv_buf ;
@@ -169,58 +179,62 @@ void h3c_response()
169
179
170
180
if (-1 == recvfrom (sockfd , (void * )recv_buf , BUF_LEN , 0 , \
171
181
(struct sockaddr * )& addr , & len ))
172
- exit ( errno ) ;
182
+ return -1 ;
173
183
174
184
if (pkt -> eapol_header .type != EAPOL_EAPPACKET )
175
185
{
176
186
/*
177
187
* Got unknown eapol type
178
188
*/
179
- return ;
189
+ return 0 ;
180
190
}
181
191
182
192
if (pkt -> eap_header .code == EAP_SUCCESS )
183
193
{
184
194
/*
185
195
* Got success
186
- * Go daemon
187
- * NOT always works on unix
188
196
*/
189
-
190
- daemon (0 , 0 );
197
+ if (NULL != success_callback )
198
+ return (* success_callback )();
199
+ else
200
+ return 0 ;
191
201
}
192
202
else if (pkt -> eap_header .code == EAP_FAILURE )
193
203
{
194
204
/*
195
205
* Got failure
196
206
*/
197
- exit (-1 );
207
+ if (NULL != * failure_callback )
208
+ return (* failure_callback )();
209
+ else
210
+ return 0 ;
198
211
}
199
212
else if (pkt -> eap_header .code == EAP_REQUEST )
200
213
{
201
214
/*
202
215
* Got request
203
- * Response according request type
216
+ * Response according to request type
204
217
*/
205
218
if (pkt -> eap_header .type == EAP_TYPE_ID )
206
219
{
207
- h3c_send_id (pkt -> eap_header .id );
220
+ return h3c_send_id (pkt -> eap_header .id );
208
221
}
209
222
else if (pkt -> eap_header .type == EAP_TYPE_MD5 )
210
223
{
211
224
unsigned char * md5 ;
212
225
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 );
214
227
}
215
228
else if (pkt -> eap_header .type == EAP_TYPE_H3C )
216
229
{
217
- h3c_send_h3c (pkt -> eap_header .id );
230
+ return h3c_send_h3c (pkt -> eap_header .id );
218
231
}
219
232
}
220
233
else if (pkt -> eap_header .code == EAP_RESPONSE )
221
234
{
222
235
/*
223
236
* Got response
224
237
*/
238
+ return 0 ;
225
239
}
226
240
}
0 commit comments