diff options
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/socket.c b/src/socket.c index 4338a49..40c43dd 100644 --- a/src/socket.c +++ b/src/socket.c @@ -1,5 +1,5 @@ /* This file is part of GNU Pies. - Copyright (C) 2007-2020 Sergey Poznyakoff + Copyright (C) 2007-2023 Sergey Poznyakoff GNU Pies is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -404,6 +404,7 @@ struct sockinst int fd; int dead; socket_handler_t handler[3]; + void (*free_data)(void *); void *data; }; @@ -437,7 +438,8 @@ register_socket (int fd, socket_handler_t rd, socket_handler_t wr, socket_handler_t ex, - void *data) + void *data, + void (*free_data) (void *)) { struct sockinst *sip = grecs_malloc (sizeof *sip); sip->fd = fd; @@ -445,6 +447,7 @@ register_socket (int fd, sip->handler[PIES_EVT_RD] = rd; sip->handler[PIES_EVT_WR] = wr; sip->handler[PIES_EVT_EX] = ex; + sip->free_data = free_data; sip->data = data; sip->next = NULL; sip->prev = si_tail; @@ -515,6 +518,10 @@ deregister_socket (int fd) struct sockinst *sp = find_socket (fd); if (!sp) return; + if (sp->free_data) + sp->free_data (sp->data); + sp->data = NULL; + sp->free_data = NULL; if (si_iterating) sp->dead = 1; else @@ -523,14 +530,14 @@ deregister_socket (int fd) int -register_program_socket (int socktype, int fd, void *data) +register_program_socket (int socktype, int fd, void *data, void (*free_data) (void*)) { if (socktype == SOCK_STREAM && listen (fd, 8) == -1) { logmsg (LOG_ERR, "listen: %s", strerror (errno)); return 1; } - register_socket (fd, progman_accept, NULL, NULL, data); + register_socket (fd, progman_accept, NULL, NULL, data, free_data); return 0; } |