18
18
19
19
#include "jsonrpc-c.h"
20
20
21
+ struct ev_loop * loop ;
22
+
21
23
// get sockaddr, IPv4 or IPv6:
22
24
static void * get_in_addr (struct sockaddr * sa ) {
23
25
if (sa -> sa_family == AF_INET ) {
@@ -234,8 +236,13 @@ static void accept_cb(struct ev_loop *loop, ev_io *w, int revents) {
234
236
}
235
237
}
236
238
237
- int jrpc_server_init (struct jrpc_server * server , struct ev_loop * loop ,
238
- int port_number ) {
239
+ int jrpc_server_init (struct jrpc_server * server , int port_number ) {
240
+ loop = EV_DEFAULT ;
241
+ return jrpc_server_init_with_ev_loop (server , port_number , loop );
242
+ }
243
+
244
+ int jrpc_server_init_with_ev_loop (struct jrpc_server * server ,
245
+ int port_number , struct ev_loop * loop ) {
239
246
memset (server , 0 , sizeof (struct jrpc_server ));
240
247
server -> loop = loop ;
241
248
server -> port_number = port_number ;
@@ -246,10 +253,10 @@ int jrpc_server_init(struct jrpc_server *server, struct ev_loop *loop,
246
253
server -> debug_level = strtol (debug_level_env , NULL , 10 );
247
254
printf ("JSONRPC-C Debug level %d\n" , server -> debug_level );
248
255
}
249
- return 0 ;
256
+ return __jrpc_server_start ( server ) ;
250
257
}
251
258
252
- int jrpc_server_start (struct jrpc_server * server ) {
259
+ static int __jrpc_server_start (struct jrpc_server * server ) {
253
260
int sockfd ;
254
261
struct addrinfo hints , * servinfo , * p ;
255
262
int yes = 1 ;
@@ -309,10 +316,35 @@ int jrpc_server_start(struct jrpc_server *server) {
309
316
return 0 ;
310
317
}
311
318
319
+ void jrpc_server_run (struct jrpc_server * server ){
320
+ ev_run (server -> loop , 0 );
321
+ }
322
+
312
323
int jrpc_server_stop (struct jrpc_server * server ) {
324
+ ev_break (server -> loop , EVBREAK_ALL );
313
325
return 0 ;
314
326
}
315
327
328
+ void jrpc_server_destroy (struct jrpc_server * server ){
329
+ /* Don't destroy server */
330
+ int i ;
331
+ for (i = 0 ; i < server -> procedure_count ; i ++ ){
332
+ jrpc_procedure_destroy ( & (server -> procedures [i ]) );
333
+ }
334
+ free (server -> procedures );
335
+ }
336
+
337
+ static void jrpc_procedure_destroy (struct jrpc_procedure * procedure ){
338
+ if (procedure -> name ){
339
+ free (procedure -> name );
340
+ procedure -> name = NULL ;
341
+ }
342
+ if (procedure -> data ){
343
+ free (procedure -> data );
344
+ procedure -> data = NULL ;
345
+ }
346
+ }
347
+
316
348
int jrpc_register_procedure (struct jrpc_server * server ,
317
349
jrpc_function function_pointer , char * name , void * data ) {
318
350
int i = server -> procedure_count ++ ;
@@ -334,5 +366,35 @@ int jrpc_register_procedure(struct jrpc_server *server,
334
366
}
335
367
336
368
int jrpc_deregister_procedure (struct jrpc_server * server , char * name ) {
369
+ /* Search the procedure to deregister */
370
+ int i ;
371
+ int found = 0 ;
372
+ if (server -> procedures ){
373
+ for (i = 0 ; i < server -> procedure_count ; i ++ ){
374
+ if (found )
375
+ server -> procedures [i - 1 ] = server -> procedures [i ];
376
+ else if (!strcmp (name , server -> procedures [i ].name )){
377
+ found = 1 ;
378
+ jrpc_procedure_destroy ( & (server -> procedures [i ]) );
379
+ }
380
+ }
381
+ if (found ){
382
+ server -> procedure_count -- ;
383
+ if (server -> procedure_count ){
384
+ struct jrpc_procedure * ptr = realloc (server -> procedures ,
385
+ sizeof (struct jrpc_procedure ) * server -> procedure_count );
386
+ if (!ptr ){
387
+ perror ("realloc" );
388
+ return -1 ;
389
+ }
390
+ server -> procedures = ptr ;
391
+ }else {
392
+ server -> procedures = NULL ;
393
+ }
394
+ }
395
+ } else {
396
+ fprintf (stderr , "server : procedure '%s' not found\n" , name );
397
+ return -1 ;
398
+ }
337
399
return 0 ;
338
400
}
0 commit comments