Skip to content

Commit f1e8833

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 f1e8833

6 files changed

Lines changed: 40 additions & 16 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) { \

FreeRTOS/src/main.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,19 @@ void MicroHTTPServer_task() {
4747
AddRoute(HTTP_POST, "/fib", Fib);
4848
AddRoute(HTTP_POST, "/led", LED);
4949
USART_Printf(USART2, "Going to start Micro HTTP Server.\r\n");
50-
HTTPServerInit(&srv, MHS_PORT);
51-
USART_Printf(USART2, "Micro HTTP Server started and listening.\r\n");
52-
while(1) {
53-
HTTPServerRun(&srv, Dispatch);
54-
/* Reschedule after each HTTP server run turn. */
55-
vTaskDelay(10);
50+
if (HTTPServerInit(&srv, MHS_PORT) < 0) {
51+
USART_Printf(USART2, "Micro HTTP Server initialzation failed.\r\n");
52+
}
53+
else
54+
{
55+
USART_Printf(USART2, "Micro HTTP Server started and listening.\r\n");
56+
while(1) {
57+
HTTPServerRun(&srv, Dispatch);
58+
/* Reschedule after each HTTP server run turn. */
59+
vTaskDelay(10);
60+
}
61+
HTTPServerClose(&srv);
5662
}
57-
HTTPServerClose(&srv);
5863

5964
vTaskDelete(NULL);
6065
}

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) { \

c-version/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ int main(void) {
2121
AddRoute(HTTP_GET, "/", HelloPage);
2222
AddRoute(HTTP_POST, "/fib", Fib);
2323
/* Initial the HTTP server and make it listening on MHS_PORT. */
24-
HTTPServerInit(&srv, MHS_PORT);
24+
if (HTTPServerInit(&srv, MHS_PORT) < 0)
25+
return -1;
2526
/* Run the HTTP server forever. */
2627
/* Run the dispatch callback if there is a new request */
2728
HTTPServerRunLoop(&srv, Dispatch);

0 commit comments

Comments
 (0)