added some code & compiler information to cmd_netinfo
[NeonServV5.git] / ChanUser.c
1
2 #include "ChanUser.h"
3 #include "ChanNode.h"
4 #include "UserNode.h"
5
6 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
7     struct ChanUser *chanuser = malloc(sizeof(*chan));
8     if (!chanuser)
9     {
10         perror("malloc() failed");
11         return NULL;
12     }
13     chanuser->flags = 0;
14     chanuser->user = user;
15     chanuser->chan = chan;
16
17     chanuser->next_user = chan->user;
18     chan->user = chanuser;
19     chan->usercount++;
20
21     chanuser->next_chan = user->channel;
22     user->channel = chanuser;
23
24     return chanuser;
25 }
26
27 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
28     struct ChanUser *chanuser;
29     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
30         if(chanuser->chan == chan)
31             return 1;
32     }
33     return 0;
34 }
35
36 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
37     struct ChanUser *chanuser;
38     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
39         if(chanuser->chan == chan)
40             return chanuser;
41     }
42     return NULL;
43 }
44
45 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
46     if(last == NULL)
47         return chan->user;
48     else
49         return last->next_user;
50 }
51
52 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
53     if(last == NULL)
54         return user->channel;
55     else
56         return last->next_chan;
57 }
58
59 void delChanUser(struct ChanUser *chanuser, int freeChanUser) {
60     struct ChanUser *cchanuser, *last;
61     //remove it from the user's channel-list
62     last = NULL;
63     for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
64         if(cchanuser == chanuser) {
65             if(last) 
66                 last->next_chan = chanuser->next_chan;
67             else
68                 chanuser->user->channel = chanuser->next_chan;
69             break;
70         } else
71             last = cchanuser;
72     }
73
74     //remove it from the channel's user-list
75     last = NULL;
76     for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
77         if(cchanuser == chanuser) {
78             chanuser->chan->usercount--;
79             if(last) 
80                 last->next_user = chanuser->next_user;
81             else
82                 chanuser->chan->user = chanuser->next_user;
83             break;
84         } else
85             last = cchanuser;
86     }
87     
88     if(freeChanUser)
89         free(chanuser);
90     else {
91         chanuser->next_chan = NULL;
92         chanuser->next_user = NULL;
93     }
94 }
95
96 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) {
97     struct ChanUser *cchanuser, *last;
98     if(remove_from_userlist) {
99         //remove it from the channel's user-list
100         last = NULL;
101         for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
102             if(cchanuser == chanuser) {
103                 chanuser->chan->usercount--;
104                 if(last) 
105                     last->next_user = chanuser->next_user;
106                 else
107                     chanuser->chan->user = chanuser->next_user;
108                 break;
109             } else
110                 last = cchanuser;
111         }
112         chanuser->next_user = NULL;
113     }
114     if(remove_from_channellist) {
115         //remove it from the user's channel-list
116         last = NULL;
117         for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
118             if(cchanuser == chanuser) {
119                 if(last) 
120                     last->next_chan = chanuser->next_chan;
121                 else
122                     chanuser->user->channel = chanuser->next_chan;
123                 break;
124             } else
125                 last = cchanuser;
126         }
127         chanuser->next_chan = NULL;
128     }
129     
130     if(freeChanUser)
131         free(chanuser);
132 }
133