Skip to content

Commit abf10e8

Browse files
committed
Improvement: Avoid "exit" in the libraries.
Using "exit" in a library isn't too great, depending on the application. In an embedded environment, where the application may have other functions, it's better to just return an error. Removes the use of "exit". Adds a return status to HTTPServerInit. Also adds protective checks in HTTPServerRun and HTTPServerClose, if these were called, despite HTTPServerInit failing (so socket was invalid). See: #9
1 parent d419fb3 commit abf10e8

4 files changed

Lines changed: 26 additions & 8 deletions

File tree

FreeRTOS/lib/server.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ HTTPReq http_req[MAX_HTTP_CLIENT];
3636
uint8_t req_buf[MAX_HTTP_CLIENT][MAX_HEADER_SIZE + MAX_BODY_SIZE];
3737
uint8_t res_buf[MAX_HTTP_CLIENT][MAX_HEADER_SIZE + MAX_BODY_SIZE];
3838

39-
void HTTPServerInit(HTTPServer *srv, uint16_t port) {
39+
int HTTPServerInit(HTTPServer *srv, uint16_t port) {
4040
struct sockaddr_in srv_addr;
4141
unsigned int i;
4242

4343
/* Have a server socket. */
4444
srv->sock = socket(AF_INET, SOCK_STREAM, 0);
45-
if(srv->sock < 0) exit(1);
45+
if(srv->sock < 0)
46+
return -1;
4647
/* Set server address. */
4748
memset(&srv_addr, 0, sizeof(srv_addr));
4849
srv_addr.sin_family = AF_INET;
@@ -52,7 +53,8 @@ void HTTPServerInit(HTTPServer *srv, uint16_t port) {
5253
setsockopt(srv->sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
5354
/* Bind the server socket with the server address. */
5455
if(bind(srv->sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) {
55-
exit(1);
56+
HTTPServerClose(srv);
57+
return -1;
5658
}
5759
/* Set the server socket non-blocking. */
5860
fcntl(srv->sock, F_SETFL, O_NONBLOCK);
@@ -75,6 +77,7 @@ void HTTPServerInit(HTTPServer *srv, uint16_t port) {
7577
http_req[i].clisock = -1;
7678
http_req[i].work_state = NOTWORK_SOCKET;
7779
}
80+
return 0;
7881
}
7982

8083
void _HTTPServerAccept(HTTPServer *srv) {
@@ -385,6 +388,9 @@ void HTTPServerRun(HTTPServer *srv, HTTPREQ_CALLBACK callback) {
385388
struct timeval timeout = {0, 0};
386389
uint16_t i;
387390

391+
if (srv->sock<0)
392+
return;
393+
388394
/* Copy master socket queue to readable, writeable socket queue. */
389395
readable = srv->_read_sock_pool;
390396
writeable = srv->_write_sock_pool;
@@ -426,8 +432,11 @@ void HTTPServerRun(HTTPServer *srv, HTTPREQ_CALLBACK callback) {
426432
}
427433

428434
void HTTPServerClose(HTTPServer *srv) {
435+
if (srv->sock<0)
436+
return;
429437
shutdown(srv->sock, SHUT_RDWR);
430438
close((srv)->sock);
439+
srv->sock = -1;
431440
}
432441

433442
#ifdef MICRO_HTTP_SERVER_EXAMPLE

FreeRTOS/lib/server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ typedef struct _HTTPResMessage {
7878

7979
typedef void (*HTTPREQ_CALLBACK)(HTTPReqMessage *, HTTPResMessage *);
8080

81-
void HTTPServerInit(HTTPServer *, uint16_t);
81+
int HTTPServerInit(HTTPServer *, uint16_t);
8282
void HTTPServerRun(HTTPServer *, HTTPREQ_CALLBACK);
8383
#define HTTPServerRunLoop(srv, callback) { \
8484
while(1) { \

c-version/lib/server.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@ HTTPReq http_req[MAX_HTTP_CLIENT];
3636
uint8_t req_buf[MAX_HTTP_CLIENT][MAX_HEADER_SIZE + MAX_BODY_SIZE];
3737
uint8_t res_buf[MAX_HTTP_CLIENT][MAX_HEADER_SIZE + MAX_BODY_SIZE];
3838

39-
void HTTPServerInit(HTTPServer *srv, uint16_t port) {
39+
int HTTPServerInit(HTTPServer *srv, uint16_t port) {
4040
struct sockaddr_in srv_addr;
4141
unsigned int i;
4242

4343
/* Have a server socket. */
4444
srv->sock = socket(AF_INET, SOCK_STREAM, 0);
45-
if(srv->sock < 0) exit(1);
45+
if(srv->sock < 0)
46+
return -1;
4647
/* Set server address. */
4748
memset(&srv_addr, 0, sizeof(srv_addr));
4849
srv_addr.sin_family = AF_INET;
@@ -52,7 +53,8 @@ void HTTPServerInit(HTTPServer *srv, uint16_t port) {
5253
setsockopt(srv->sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
5354
/* Bind the server socket with the server address. */
5455
if(bind(srv->sock, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) {
55-
exit(1);
56+
HTTPServerClose(srv);
57+
return -1;
5658
}
5759
/* Set the server socket non-blocking. */
5860
fcntl(srv->sock, F_SETFL, O_NONBLOCK);
@@ -75,6 +77,7 @@ void HTTPServerInit(HTTPServer *srv, uint16_t port) {
7577
http_req[i].clisock = -1;
7678
http_req[i].work_state = NOTWORK_SOCKET;
7779
}
80+
return 0;
7881
}
7982

8083
void _HTTPServerAccept(HTTPServer *srv) {
@@ -385,6 +388,9 @@ void HTTPServerRun(HTTPServer *srv, HTTPREQ_CALLBACK callback) {
385388
struct timeval timeout = {0, 0};
386389
uint16_t i;
387390

391+
if (srv->sock<0)
392+
return;
393+
388394
/* Copy master socket queue to readable, writeable socket queue. */
389395
readable = srv->_read_sock_pool;
390396
writeable = srv->_write_sock_pool;
@@ -426,8 +432,11 @@ void HTTPServerRun(HTTPServer *srv, HTTPREQ_CALLBACK callback) {
426432
}
427433

428434
void HTTPServerClose(HTTPServer *srv) {
435+
if (srv->sock<0)
436+
return;
429437
shutdown(srv->sock, SHUT_RDWR);
430438
close((srv)->sock);
439+
srv->sock = -1;
431440
}
432441

433442
#ifdef MICRO_HTTP_SERVER_EXAMPLE

c-version/lib/server.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ typedef struct _HTTPResMessage {
7878

7979
typedef void (*HTTPREQ_CALLBACK)(HTTPReqMessage *, HTTPResMessage *);
8080

81-
void HTTPServerInit(HTTPServer *, uint16_t);
81+
int HTTPServerInit(HTTPServer *, uint16_t);
8282
void HTTPServerRun(HTTPServer *, HTTPREQ_CALLBACK);
8383
#define HTTPServerRunLoop(srv, callback) { \
8484
while(1) { \

0 commit comments

Comments
 (0)