Skip to content

Commit e70d9c7

Browse files
authored
Merge pull request #10 from TangoBravo64/upstream
Upstream Fix: Library exits on "socket 0" error
2 parents fc69675 + f1e8833 commit e70d9c7

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)