diff --git a/src/common/remoteio.c b/src/common/remoteio.c --- a/src/common/remoteio.c +++ b/src/common/remoteio.c @@ -179,7 +179,8 @@ int remoteio_open_common(struct remoteio enum remoteio_method method, struct remoteio_opts *opts, remoteio_read_handle_func_t read_handler, - void *read_handler_data) + void *read_handler_data, + remoteio_close_handle_func_t close_handler) { struct remoteio *rem; @@ -200,6 +201,7 @@ int remoteio_open_common(struct remoteio rem->outmsgs = q_init(); rem->read_handler = read_handler; rem->read_handler_data = read_handler_data; + rem->close_handler = close_handler; /* * the following initialization is very important... though the * others are too, I suppose :-p. See remoteio_close() @@ -213,10 +215,11 @@ int remoteio_open_socket(struct remoteio struct remoteio_opts *opts, remoteio_read_handle_func_t read_handler, void *read_handler_data, + remoteio_close_handle_func_t close_handler, int fd) { struct remoteio *rem; - if(remoteio_open_common(remoteio, REMOTEIO_METHOD_SOCKET, opts, read_handler, read_handler_data)) + if(remoteio_open_common(remoteio, REMOTEIO_METHOD_SOCKET, opts, read_handler, read_handler_data, close_handler)) return 1; rem = *remoteio; @@ -230,6 +233,7 @@ int remoteio_open_server(struct remoteio struct remoteio_opts *opts, remoteio_read_handle_func_t read_handler, void *read_handler_data, + remoteio_close_handle_func_t close_handler, const char *servername) { struct remoteio_server *theserver; @@ -257,7 +261,7 @@ int remoteio_open_server(struct remoteio return 1; } - if(remoteio_open_common(remoteio, theserver->method, opts, read_handler, read_handler_data)) + if(remoteio_open_common(remoteio, theserver->method, opts, read_handler, read_handler_data, close_handler)) return 1; rem = *remoteio; @@ -484,6 +488,10 @@ int remoteio_close(struct remoteio *rem) return 0; } + /* call close handler */ + if(rem->close_handler) + (*rem->close_handler)(rem->opts->generic_handler_data, rem->read_handler_data); + /* cleanup multiiio stuff */ multiio_socket_del(rem->opts->multiio, rem->sock);