68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "IPCClient.h"
 | |
| 
 | |
| #include <string.h>
 | |
| #include <sys/epoll.h>
 | |
| 
 | |
| #include "util.h"
 | |
| 
 | |
| IPCClient *
 | |
| ipc_client_new(int fd)
 | |
| {
 | |
|   IPCClient *c = (IPCClient *)malloc(sizeof(IPCClient));
 | |
| 
 | |
|   if (c == NULL) return NULL;
 | |
| 
 | |
|   // Initialize struct
 | |
|   memset(&c->event, 0, sizeof(struct epoll_event));
 | |
| 
 | |
|   c->buffer_size = 0;
 | |
|   c->buffer = NULL;
 | |
|   c->fd = fd;
 | |
|   c->event.data.fd = fd;
 | |
|   c->next = NULL;
 | |
|   c->prev = NULL;
 | |
|   c->subscriptions = 0;
 | |
| 
 | |
|   return c;
 | |
| }
 | |
| 
 | |
| void
 | |
| ipc_list_add_client(IPCClientList *list, IPCClient *nc)
 | |
| {
 | |
|   DEBUG("Adding client with fd %d to list\n", nc->fd);
 | |
| 
 | |
|   if (*list == NULL) {
 | |
|     // List is empty, point list at first client
 | |
|     *list = nc;
 | |
|   } else {
 | |
|     IPCClient *c;
 | |
|     // Go to last client in list
 | |
|     for (c = *list; c && c->next; c = c->next)
 | |
|       ;
 | |
|     c->next = nc;
 | |
|     nc->prev = c;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void
 | |
| ipc_list_remove_client(IPCClientList *list, IPCClient *c)
 | |
| {
 | |
|   IPCClient *cprev = c->prev;
 | |
|   IPCClient *cnext = c->next;
 | |
| 
 | |
|   if (cprev != NULL) cprev->next = c->next;
 | |
|   if (cnext != NULL) cnext->prev = c->prev;
 | |
|   if (c == *list) *list = c->next;
 | |
| }
 | |
| 
 | |
| IPCClient *
 | |
| ipc_list_get_client(IPCClientList list, int fd)
 | |
| {
 | |
|   for (IPCClient *c = list; c; c = c->next) {
 | |
|     if (c->fd == fd) return c;
 | |
|   }
 | |
| 
 | |
|   return NULL;
 | |
| }
 | |
| 
 |