ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/src/resv.c
(Generate patch)

Comparing ircd-hybrid/trunk/src/resv.c (file contents):
Revision 1632 by michael, Sun Nov 4 15:37:10 2012 UTC vs.
Revision 1860 by michael, Thu Apr 25 15:19:00 2013 UTC

# Line 33 | Line 33
33   #include "hash.h"
34   #include "irc_string.h"
35   #include "ircd_defs.h"
36 + #include "s_misc.h"
37   #include "conf.h"
38   #include "conf_db.h"
39 + #include "channel.h"
40 + #include "hostmask.h"
41  
42   dlink_list resv_channel_list = { NULL, NULL, 0 };
43  
44  
45 < /* create_channel_resv()
43 < *
44 < * inputs       - name of channel to create resv for
45 < *              - reason for resv
46 < *              - flag, 1 for from ircd.conf 0 from elsehwere
47 < * output       - pointer to struct ResvChannel
48 < * side effects -
49 < */
50 < struct MaskItem *
51 < create_channel_resv(char *name, char *reason, int in_conf)
52 < {
53 <  struct MaskItem *conf = NULL;
54 <
55 <  if (name == NULL || reason == NULL)
56 <    return NULL;
57 <
58 <  if (hash_find_resv(name))
59 <    return NULL;
60 <
61 <  if (strlen(reason) > REASONLEN)
62 <    reason[REASONLEN] = '\0';
63 <
64 <  conf = conf_make(CONF_CRESV);
65 <
66 <  DupString(conf->name, name);
67 <  DupString(conf->reason, reason);
68 <
69 <  dlinkAdd(conf, &conf->node, &resv_channel_list);
70 <  hash_add_resv(conf);
71 <
72 <  return conf;
73 < }
74 <
75 < /* create_nick_resv()
45 > /* create_resv()
46   *
47   * inputs       - name of nick to create resv for
48   *              - reason for resv
# Line 81 | Line 51 | create_channel_resv(char *name, char *re
51   * side effects -
52   */
53   struct MaskItem *
54 < create_nick_resv(char *name, char *reason, int in_conf)
54 > create_resv(const char *name, const char *reason, const dlink_list *list)
55   {
56 +  dlink_node *ptr = NULL;
57    struct MaskItem *conf = NULL;
58 +  enum maskitem_type type;
59  
60    if (name == NULL || reason == NULL)
61      return NULL;
62  
63 <  if (find_matching_name_conf(CONF_NRESV, name, NULL, NULL, 0))
64 <    return NULL;
63 >  if (IsChanPrefix(*name))
64 >    type = CONF_CRESV;
65 >  else
66 >    type = CONF_NRESV;
67  
68 <  if (strlen(reason) > REASONLEN)
69 <    reason[REASONLEN] = '\0';
68 >  if (find_exact_name_conf(type, NULL, name, NULL, NULL))
69 >    return NULL;
70  
71 <  conf = conf_make(CONF_NRESV);
71 >  conf = conf_make(type);
72 >  conf->name = xstrdup(name);
73 >  conf->reason = xstrndup(reason, IRCD_MIN(strlen(reason), REASONLEN));
74  
75 <  DupString(conf->name, name);
76 <  DupString(conf->reason, reason);
75 >  if (list)
76 >  {
77 >    DLINK_FOREACH(ptr, list->head)
78 >    {
79 >      char nick[NICKLEN + 1];
80 >      char user[USERLEN + 1];
81 >      char host[HOSTLEN + 1];
82 >      struct split_nuh_item nuh;
83 >      struct exempt *exptr = NULL;
84 >      char *s = ptr->data;
85 >
86 >      if (strlen(s) == 2 && IsAlpha(*(s + 1) && IsAlpha(*(s + 2))))
87 >      {
88 >        exptr = MyMalloc(sizeof(*exptr));
89 >        exptr->name = xstrdup(s);
90 >        exptr->coid = GeoIP_id_by_code(s);
91 >        dlinkAdd(exptr, &exptr->node, &conf->exempt_list);
92 >      }
93 >      else
94 >      {
95 >        nuh.nuhmask  = s;
96 >        nuh.nickptr  = nick;
97 >        nuh.userptr  = user;
98 >        nuh.hostptr  = host;
99 >
100 >        nuh.nicksize = sizeof(nick);
101 >        nuh.usersize = sizeof(user);
102 >        nuh.hostsize = sizeof(host);
103 >
104 >        split_nuh(&nuh);
105 >
106 >        exptr = MyMalloc(sizeof(*exptr));
107 >        exptr->name = xstrdup(nick);
108 >        exptr->user = xstrdup(user);
109 >        exptr->host = xstrdup(host);
110 >        exptr->type = parse_netmask(host, &exptr->addr, &exptr->bits);
111 >        dlinkAdd(exptr, &exptr->node, &conf->exempt_list);
112 >      }
113 >    }
114 >  }
115  
116    return conf;
117   }
118  
119 < /* clear_conf_resv()
120 < *
107 < * inputs       - none
108 < * output       - none
109 < * side effects - All resvs are cleared out
110 < */
111 < void
112 < clear_conf_resv(void)
119 > int
120 > resv_find_exempt(const struct Client *who, const struct MaskItem *conf)
121   {
122 <  dlink_node *ptr = NULL, *next_ptr = NULL;
122 >  const dlink_node *ptr = NULL;
123  
124 <  DLINK_FOREACH_SAFE(ptr, next_ptr, resv_channel_list.head)
124 >  DLINK_FOREACH(ptr, conf->exempt_list.head)
125    {
126 <    struct MaskItem *conf = ptr->data;
126 >    const struct exempt *exptr = ptr->data;
127  
128 <    if (!IsConfDatabase(conf))
129 <      delete_channel_resv(conf);
128 >    if (exptr->coid)
129 >    {
130 >      if (exptr->coid == who->localClient->country_id)
131 >        return 1;
132 >    }
133 >    else if (!match(exptr->name, who->name) && !match(exptr->user, who->username))
134 >    {
135 >      switch (exptr->type)
136 >      {
137 >        case HM_HOST:
138 >          if (!match(exptr->host, who->host) || !match(exptr->host, who->sockhost))
139 >            return 1;
140 >          break;
141 >        case HM_IPV4:
142 >          if (who->localClient->aftype == AF_INET)
143 >            if (match_ipv4(&who->localClient->ip, &exptr->addr, exptr->bits))
144 >              return 1;
145 >          break;
146 > #ifdef IPV6
147 >        case HM_IPV6:
148 >          if (who->localClient->aftype == AF_INET6)
149 >            if (match_ipv6(&who->localClient->ip, &exptr->addr, exptr->bits))
150 >              return 1;
151 >          break;
152 > #endif
153 >        default:
154 >          assert(0);
155 >      }
156 >    }
157    }
123 – }
158  
159 < /* delete_channel_resv()
126 < *
127 < * inputs       - pointer to channel resv to delete
128 < * output       - none
129 < * side effects - given struct ResvChannel * is removed
130 < */
131 < int
132 < delete_channel_resv(struct MaskItem *conf)
133 < {
134 <  hash_del_resv(conf);
135 <  dlinkDelete(&conf->node, &resv_channel_list);
136 <  conf_free(conf);
137 <
138 <  return 1;
159 >  return 0;
160   }
161  
162   /* match_find_resv()
# Line 157 | Line 178 | match_find_resv(const char *name)
178    {
179      struct MaskItem *conf = ptr->data;
180  
181 <    if (match_chan(name, conf->name))
181 >    if (!match(conf->name, name))
182        return conf;
183    }
184  
# Line 181 | Line 202 | report_resv(struct Client *source_p)
202      conf = ptr->data;
203      sendto_one(source_p, form_str(RPL_STATSQLINE),
204                 me.name, source_p->name,
205 <               conf->hold ? 'q' : 'Q',
205 >               conf->until ? 'q' : 'Q', conf->count,
206                 conf->name, conf->reason);
207    }
208  
209    DLINK_FOREACH(ptr, nresv_items.head)
210    {
211 <    conf = ptr->data;;
211 >    conf = ptr->data;
212      sendto_one(source_p, form_str(RPL_STATSQLINE),
213                 me.name, source_p->name,
214 <               conf->hold ? 'q' : 'Q',
214 >               conf->until ? 'q' : 'Q', conf->count,
215                 conf->name, conf->reason);
216    }
217   }

Diff Legend

– Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)