aboutsummaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c15
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;
}

Return to:

Send suggestions and report system problems to the System administrator.