32
32
#include <sys/socket.h>
33
33
#include <netdb.h>
34
34
#include <sys/time.h>
35
+ #include <unistd.h>
35
36
36
37
#include "backend_event_loop.h"
37
38
#include "metadata_exporter.h"
@@ -48,10 +49,22 @@ static void md_input_gps_nsb_handle_event(void *ptr, int32_t fd, uint32_t events
48
49
struct minmea_sentence_rmc rmc ;
49
50
int32_t retval ;
50
51
51
- retval = recv (fd , rcv_buf , sizeof (rcv_buf ), 0 );
52
+ if (!mign -> sockfd )
53
+ return ;
54
+
55
+ retval = recv (mign -> sockfd , rcv_buf , sizeof (rcv_buf ), 0 );
56
+
57
+ if (retval <= 0 ) {
58
+ if (mign -> sockfd ) {
59
+ META_PRINT_SYSLOG (mign -> parent , LOG_ERR , "NSB GPS error\n" );
60
+ close (mign -> sockfd );
61
+ mign -> sockfd = 0 ;
62
+ mde_start_timer (mign -> parent -> event_loop , mign -> sock_timeout_handle ,
63
+ MD_GPS_NSB_SOCK_INTVL );
64
+ }
52
65
53
- if (retval <= 0 )
54
66
return ;
67
+ }
55
68
56
69
sentence_id = minmea_sentence_id (rcv_buf , 0 );
57
70
@@ -93,9 +106,7 @@ static void md_input_gps_nsb_handle_event(void *ptr, int32_t fd, uint32_t events
93
106
mde_publish_event_obj (mign -> parent , (struct md_event * ) & gps_event );
94
107
}
95
108
96
- static uint8_t md_input_gps_nsb_config (struct md_input_gps_nsb * mign ,
97
- const char * address ,
98
- const char * port )
109
+ static uint8_t md_input_gps_nsb_create_socket (struct md_input_gps_nsb * mign )
99
110
{
100
111
int32_t sockfd = -1 ;
101
112
struct addrinfo hints , * res ;
@@ -105,7 +116,7 @@ static uint8_t md_input_gps_nsb_config(struct md_input_gps_nsb *mign,
105
116
hints .ai_socktype = SOCK_DGRAM ;
106
117
hints .ai_protocol = IPPROTO_UDP ;
107
118
108
- if (getaddrinfo (address , port , & hints , & res )) {
119
+ if (getaddrinfo (mign -> addr , mign -> port , & hints , & res )) {
109
120
META_PRINT_SYSLOG (mign -> parent , LOG_ERR , "Could not get address info for NSB GPS\n" );
110
121
return RETVAL_FAILURE ;
111
122
}
@@ -122,17 +133,44 @@ static uint8_t md_input_gps_nsb_config(struct md_input_gps_nsb *mign,
122
133
return RETVAL_FAILURE ;
123
134
}
124
135
125
- if (!(mign -> event_handle = backend_create_epoll_handle (mign ,
126
- sockfd , md_input_gps_nsb_handle_event )))
127
- return RETVAL_FAILURE ;
136
+ if (!(mign -> event_handle )) {
137
+ if (!(mign -> event_handle = backend_create_epoll_handle (mign ,
138
+ sockfd , md_input_gps_nsb_handle_event )))
139
+ return RETVAL_FAILURE ;
140
+ }
128
141
129
142
backend_event_loop_update (mign -> parent -> event_loop , EPOLLIN , EPOLL_CTL_ADD ,
130
143
sockfd , mign -> event_handle );
131
144
145
+ mign -> sockfd = sockfd ;
132
146
META_PRINT_SYSLOG (mign -> parent , LOG_INFO , "NSB GPS socket %d\n" , sockfd );
133
147
return RETVAL_SUCCESS ;
134
148
}
135
149
150
+ static void md_input_gps_nsb_sock_timeout (void * ptr )
151
+ {
152
+ struct md_input_gps_nsb * mign = ptr ;
153
+
154
+ if (md_input_gps_nsb_create_socket (mign ) == RETVAL_FAILURE ) {
155
+ mign -> sock_timeout_handle -> intvl = MD_GPS_NSB_SOCK_INTVL ;
156
+ } else {
157
+ mign -> sock_timeout_handle -> intvl = 0 ;
158
+ }
159
+ }
160
+
161
+ static uint8_t md_input_gps_nsb_config (struct md_input_gps_nsb * mign ,
162
+ const char * address ,
163
+ const char * port )
164
+ {
165
+ //call create_socket
166
+ if (md_input_gps_nsb_create_socket (mign ) == RETVAL_FAILURE ) {
167
+ mde_start_timer (mign -> parent -> event_loop , mign -> sock_timeout_handle ,
168
+ MD_GPS_NSB_SOCK_INTVL );
169
+ }
170
+
171
+ return RETVAL_SUCCESS ;
172
+ }
173
+
136
174
static uint8_t md_input_gps_nsb_init (void * ptr , json_object * config )
137
175
{
138
176
struct md_input_gps_nsb * mign = ptr ;
@@ -153,12 +191,28 @@ static uint8_t md_input_gps_nsb_init(void *ptr, json_object* config)
153
191
return RETVAL_FAILURE ;
154
192
}
155
193
194
+ if (strlen (address ) > (sizeof (mign -> addr ) - 1 ) ||
195
+ strlen (port ) > (sizeof (mign -> port ) - 1 )) {
196
+ META_PRINT_SYSLOG (mign -> parent , LOG_ERR , "NSB GPS argument too long\n" );
197
+ return RETVAL_FAILURE ;
198
+ }
199
+
200
+ memcpy (mign -> addr , address , strlen (address ));
201
+ memcpy (mign -> port , port , strlen (port ));
202
+
203
+ if (!(mign -> sock_timeout_handle = backend_event_loop_create_timeout (0 ,
204
+ md_input_gps_nsb_sock_timeout , mign , 0 ))) {
205
+ META_PRINT_SYSLOG (mign -> parent , LOG_ERR , "Failed to create NSB "
206
+ "timer\n" );
207
+ return RETVAL_FAILURE ;
208
+ }
209
+
156
210
return md_input_gps_nsb_config (mign , address , port );
157
211
}
158
212
159
213
void md_gps_nsb_usage ()
160
214
{
161
- fprintf (stderr , "\"nsp_gps \": {\t\tNSB GPS input\n" );
215
+ fprintf (stderr , "\"gps_nsb \": {\t\tNSB GPS input\n" );
162
216
fprintf (stderr , " \"address\":\t\tIP NSB broadcasts GPS to\n" );
163
217
fprintf (stderr , " \"port\":\t\tPort NSB broadcasts GPS to\n" );
164
218
fprintf (stderr , "},\n" );
0 commit comments