#define KEY_ISSUER "issuer"
#define KEY_ISSUED "issued"
#define KEY_DEVNULL_CLASSES "classes"
-#define KEY_DEVNULL_LASTID "lastid"
#define KEY_DEVNULL_ID "id"
#define KEY_DEVNULL_NAME "class"
#define KEY_DEVNULL_MODE "modes"
th = calloc(1, sizeof(*th));
if (!th)
return;
- if(id)
+ if(id) {
th->id = id;
- else
+ if(id >= devnull_last_id)
+ devnull_last_id = id+1;
+ } else
th->id = (++devnull_last_id);
th->name = strdup(name);
th->modes = modes;
devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra))
{
struct record_data *rd = data;
- const char *nameb = name, *str;
+ const char *str;
unsigned long modes, maxchan, maxsendq;
unsigned int id, ii;
if ((str = database_get_data(object, KEY_TIME, RECDB_QSTRING)))
max_clients_time = atoi(str);
}
- if ((str = database_get_data(object, KEY_DEVNULL_LASTID, RECDB_QSTRING)))
- devnull_last_id = atoi(str);
if ((object = database_get_data(conf_db, KEY_TRUSTED_HOSTS, RECDB_OBJECT)))
dict_foreach(object, trusted_host_read, opserv_trusted_hosts);
if ((object = database_get_data(conf_db, KEY_DEVNULL_CLASSES, RECDB_OBJECT)))
}
saxdb_end_record(ctx);
}
- saxdb_write_int(ctx, KEY_DEVNULL_LASTID, devnull_last_id);
/* gags */
if (gagList) {
struct gag_entry *gag;
tbl.contents[0][12] = "+X";
tbl.contents[0][13] = "MaxQ";
tbl.contents[0][14] = "OpMe";
- if(!count)
- {
+ if(!count) {
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
reply("MSG_NONE");
free(tbl.contents[0]);
} else {
tbl.contents[ii][5] = off;
}
- if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
+ if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
tbl.contents[ii][6] = on;
} else {
tbl.contents[ii][6] = off;
}
- if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
+ if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
tbl.contents[ii][7] = on;
} else {
tbl.contents[ii][7] = off;
}
- if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
+ if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
tbl.contents[ii][8] = on;
} else {
tbl.contents[ii][8] = off;
}
- if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
+ if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
tbl.contents[ii][9] = on;
} else {
tbl.contents[ii][9] = off;
}
- if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
+ if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
tbl.contents[ii][10] = on;
} else {
tbl.contents[ii][10] = off;
}
- if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
+ if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
tbl.contents[ii][11] = on;
} else {
tbl.contents[ii][11] = off;
}
- if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
+ if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
tbl.contents[ii][12] = on;
} else {
tbl.contents[ii][12] = off;
}
if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
- tbl.contents[ii][13] = on;
+ char maxsenqbuf[MAXLEN];
+ sprintf(maxsenqbuf, "%lu", th->maxsendq);
+ tbl.contents[ii][13] = strdup(maxsenqbuf);
} else {
- tbl.contents[ii][13] = off;
+ tbl.contents[ii][13] = strdup(off);
}
if(DEVNULL_HAS_PRIV(th, OPME)) {
tbl.contents[ii][14] = on;
}
}
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
- for(ii = 1; ii < tbl.length; ++ii)
- {
+ for(ii = 1; ii < tbl.length; ++ii) {
+ free(tbl.contents[ii][13]);
free(tbl.contents[ii]);
}
free(tbl.contents[0]);
return 0;
}
- opserv_add_devnull_class(argv[1], (++devnull_last_id), 0, 0, 0);
+ opserv_add_devnull_class(argv[1], 0, 0, 0, 0);
reply("OSMSG_DEVNULL_ADDED",argv[1]);
return 1;
}
int devnull_user_has_priv(struct handle_info *hi, int devnull_priv) {
if(devnull_check_priv_func) {
- int ext_privs = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi, devnull_priv);
- if((ext_privs & devnull_priv))
- return (ext_privs & devnull_priv);
+ struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+ if((ext_class.modes & devnull_priv))
+ return (ext_class.modes & devnull_priv);
}
- if(!hi->devnull)
+ if(!hi->devnull_id)
return 0;
- struct devnull_class *th;
- if(!(th = dict_find(opserv_devnull_classes, hi->devnull, NULL)))
+ struct devnull_class *th = devnull_find_id(hi->devnull_id);
+ if(!th)
return 0;
-
return (th->modes & devnull_priv);
}
struct devnull_class devnull_user_get_class(struct handle_info *hi) {
struct devnull_class th;
- th.name = NULL;
- th.modes = 0;
+ memset(&th, 0, sizeof(th));
+
+ if(devnull_check_priv_func) {
+ struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+ th.modes |= ext_class.modes;
+ if(ext_class.name)
+ th.name = ext_class.name;
+ if(DEVNULL_HAS_PRIV(&th, CHANLIMIT))
+ th.maxchan = ext_class.maxchan;
+ if(DEVNULL_HAS_PRIV(&th, MAXSENDQ))
+ th.maxsendq = ext_class.maxsendq;
+ }
- if(hi->devnull) {
+ if(hi->devnull_id) {
struct devnull_class *thp;
- if((thp = dict_find(opserv_devnull_classes, hi->devnull, NULL))) {
+ if((thp = devnull_find_id(hi->devnull_id))) {
if(DEVNULL_HAS_PRIV(thp, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < thp->maxchan))
th.maxchan = thp->maxchan;
if(DEVNULL_HAS_PRIV(thp, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < thp->maxsendq))