Follow our own style guide.
[AROS.git] / arch / all-mingw32 / bsdsocket / bsdsocket_open.c
blob5ddec1d9eeb9d5f8b561054ee7d1ba203944fefe
1 #include <aros/asmcall.h>
2 #include <aros/symbolsets.h>
3 #include <proto/exec.h>
5 #include "bsdsocket_intern.h"
6 #include "bsdsocket_util.h"
8 extern APTR BSDSocket_FuncTable[];
10 static AROS_UFH2(LONG, TaskKeyCompare,
11 AROS_UFHA(const struct AVLNode *, td, A0),
12 AROS_UFHA(AVLKey, key, A1))
14 AROS_USERFUNC_INIT
16 AVLKey id = ((struct TaskNode *)td)->task;
18 if (id == key)
19 return 0;
20 else if (id < key)
21 return -1;
22 else
23 return 1;
25 AROS_USERFUNC_EXIT
28 static AROS_UFH2(LONG, TaskNodeCompare,
29 AROS_UFHA(const struct AVLNode *, td1, A0),
30 AROS_UFHA(const struct AVLNode *, td2, A1))
32 AROS_USERFUNC_INIT
34 IPTR t1 = (IPTR)((struct TaskNode *)td1)->task;
35 IPTR t2 = (IPTR)((struct TaskNode *)td2)->task;
37 if (t1 == t2)
38 return 0;
39 else if (t1 < t2)
40 return -1;
41 else
42 return 1;
44 AROS_USERFUNC_EXIT
47 AROS_LH1(struct TaskBase *, BSDSocket_OpenLib,
48 AROS_LHA (ULONG, version, D0),
49 struct bsdsocketBase *, SocketBase, 1, BSDSocket)
51 AROS_LIBFUNC_INIT
53 struct TaskBase *tb;
54 struct Task *task = FindTask(NULL);
55 struct TaskNode *tn = (struct TaskNode *)AVL_FindNode(SocketBase->tasks, task, TaskKeyCompare);
57 D(bug("[OpenLib] Task 0x%p\n", task));
58 if (tn) {
59 tb = tn->self;
60 D(bug("[OpenLib] Found TaskBase 0x%p\n", tb));
61 } else {
62 APTR pool = CreatePool(MEMF_ANY, 2048, 1024);
64 D(bug("[OpenLib] Created pool 0x%p\n", pool));
65 if (!pool)
66 return NULL;
68 tb = (struct TaskBase *)MakeLibrary(BSDSocket_FuncTable, NULL, NULL, sizeof(struct TaskBase), NULL);
69 D(bug("[OpenLib] Created TaskBase 0x%p\n", tb));
70 if (!tb)
72 DeletePool(pool);
73 return NULL;
76 tb->lib.lib_Node.ln_Name = SocketBase->lib.lib_Node.ln_Name;
77 tb->lib.lib_Node.ln_Type = NT_LIBRARY;
78 tb->lib.lib_Node.ln_Pri = SocketBase->lib.lib_Node.ln_Pri;
79 tb->lib.lib_Flags = LIBF_CHANGED;
80 tb->lib.lib_Version = SocketBase->lib.lib_Version;
81 tb->lib.lib_Revision = SocketBase->lib.lib_Revision;
82 tb->lib.lib_IdString = SocketBase->lib.lib_IdString;
84 SumLibrary(&tb->lib);
86 tb->n.task = task;
87 tb->n.self = tb;
88 tb->glob = SocketBase;
89 tb->pool = pool;
90 tb->errnoPtr = &tb->errnoVal;
91 tb->errnoSize = sizeof(tb->errnoVal);
92 tb->sigintr = SIGBREAKF_CTRL_C;
94 SetDTableSize(FD_SETSIZE, tb);
96 AVL_AddNode(&SocketBase->tasks, &tb->n.node, TaskNodeCompare);
99 if (tb)
101 tb->lib.lib_OpenCnt++;
102 SocketBase->lib.lib_OpenCnt++;
103 D(bug("[socket] Task open count %u, global open count %u\n", tb->lib.lib_OpenCnt, SocketBase->lib.lib_OpenCnt));
106 return tb;
108 AROS_LIBFUNC_EXIT
111 AROS_LH0(BPTR, BSDSocket_CloseLib,
112 struct TaskBase *, tb, 2, BSDSocket)
114 AROS_LIBFUNC_INIT
116 struct bsdsocketBase *SocketBase = tb->glob;
118 D(bug("[CloseLib] TaskBase 0x%p\n", tb));
120 tb->lib.lib_OpenCnt--;
121 SocketBase->lib.lib_OpenCnt--;
122 D(bug("[CloseLib] Task open count %u, global open count %u\n", tb->lib.lib_OpenCnt, SocketBase->lib.lib_OpenCnt));
124 if (!tb->lib.lib_OpenCnt)
126 APTR addr;
127 int i;
129 D(bug("[CloseLib] dTableSize is %u\n", tb->dTableSize));
130 for (i = 0; i < tb->dTableSize; i++)
131 IntCloseSocket(i, tb);
133 AVL_RemNodeByAddress(&SocketBase->tasks, &tb->n.node);
135 DeletePool(tb->pool);
137 addr = (APTR)tb - tb->lib.lib_NegSize;
138 FreeMem(addr, tb->lib.lib_NegSize + tb->lib.lib_PosSize);
141 if (SocketBase->lib.lib_OpenCnt)
142 return NULL;
144 if (SocketBase->lib.lib_Flags & LIBF_DELEXP)
145 return AROS_LC1(BPTR, BSDSocket_ExpungeLib,
146 AROS_LCA(struct bsdsocketBase *, SocketBase, D0),
147 struct bsdsocketBase *, SocketBase, 3, BSDSocket);
148 else
149 return NULL;
151 AROS_LIBFUNC_EXIT