1: /*************************************************************************
2: * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
6: * $Id: proc.c,v 1.1.1.1 2011/10/04 22:37:46 misho Exp $
7: *
8: *************************************************************************/
9: #include "global.h"
10: #include "anshd.h"
11: #include "proc.h"
12:
13:
14: struct tagProc *
15: InitProc(int h, struct sockaddr *sa, u_short id, int len)
16: {
17: struct tagProc *proc;
18:
19: FTRACE(5);
20:
21: proc = malloc(sizeof(struct tagProc));
22: if (!proc) {
23: ERR("Not enough memory #%d - %s", errno, strerror(errno));
24: return NULL;
25: } else
26: memset(proc, 0, sizeof(struct tagProc));
27: proc->proc_sock = h;
28: proc->proc_id = id;
29: if (sa)
30: memcpy(&proc->proc_cli, sa, sizeof(struct sockaddr));
31:
32: proc->proc_blen = len;
33: proc->proc_buf_[0] = malloc(proc->proc_blen);
34: if (!proc->proc_buf_[0]) {
35: free(proc);
36: proc = NULL;
37: }
38: proc->proc_buf_[1] = malloc(proc->proc_blen);
39: if (!proc->proc_buf_[1]) {
40: free(proc->proc_buf_[0]);
41: free(proc);
42: proc = NULL;
43: }
44:
45: SLIST_INSERT_HEAD(&pH, proc, proc_next);
46: return proc;
47: }
48:
49: void
50: FiniProcByID(u_short id)
51: {
52: struct tagProc *proc;
53:
54: SLIST_FOREACH(proc, &pH, proc_next)
55: if (proc->proc_id == id) {
56: SLIST_REMOVE(&pH, proc, tagProc, proc_next);
57: FreeProc(&proc);
58: }
59: }
60:
61: void
62: FreeProc(struct tagProc ** __restrict proc)
63: {
64: FTRACE(5);
65:
66: assert(proc && *proc);
67: if (!*proc)
68: return;
69:
70: if ((*proc)->proc_buf_[1])
71: free((*proc)->proc_buf_[1]);
72: if ((*proc)->proc_buf_[0])
73: free((*proc)->proc_buf_[0]);
74: free(*proc);
75: *proc = NULL;
76: }
77:
78: void
79: DestroyProc()
80: {
81: struct tagProc *proc;
82:
83: while ((proc = SLIST_FIRST(&pH))) {
84: SLIST_REMOVE_HEAD(&pH, proc_next);
85: FreeProc(&proc);
86: }
87: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>