/* temporary structs */
struct hs_fakehost_info {
- int parse_state;
+ unsigned int parse_state : 4;
+ unsigned int have_secondlevel : 1;
char *tlfh_name;
char *slfh_name;
struct hs_toplevel *tlfh;
struct hs_fakehost_info parse_fakehost_info(char *fakehost, int fix_name_case) {
struct hs_fakehost_info fhinfo;
int i;
+ memset(&fhinfo, 0, sizeof(fhinfo));
for(i = strlen(fakehost)-1; i >= 0; i--) {
- if(!isalnum(fakehost[i]) && !strchr(HS_FAKEHOST_SPECIAL_CHARS, fakehost[i])) {
+ if(!isalnum(fakehost[i]) && fakehost[i] != '.' && !(fakehost[i] == '*' && i == 0) && !strchr(HS_FAKEHOST_SPECIAL_CHARS, fakehost[i])) {
fhinfo.parse_state = HS_FHPARSE_INVALID;
return fhinfo;
}
fhinfo.tlfh_name[0] = '\0';
return fhinfo;
}
- if(!irccasecmp(fhinfo.slfh_name, "*"))
- fhinfo.slfh_name = NULL;
+ if(irccasecmp(fhinfo.slfh_name, "*"))
+ fhinfo.have_secondlevel = 1;
struct hs_toplevel *tlfh;
struct hs_secondlevel *slfh;
for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
fhinfo.parse_state = HS_FHPARSE_UNKNOWN;
return fhinfo;
}
- if(fhinfo.slfh_name) {
+ if(fhinfo.have_secondlevel) {
for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
if(!irccasecmp(slfh->fakehost, fhinfo.slfh_name)) break;
}
if(fix_name_case) {
//simply copy the stored fakehosts over the given ones
strcpy(fhinfo.tlfh_name, fhinfo.tlfh->fakehost);
- strcpy(fhinfo.slfh_name, fhinfo.slfh->fakehost);
+ if(fhinfo.slfh)
+ strcpy(fhinfo.slfh_name, fhinfo.slfh->fakehost);
}
fhinfo.parse_state = HS_FHPARSE_SUCCESS;
return fhinfo;
reply("HSMSG_TOPLEVEL_INVALID", argv[1]);
return 0;
}
- if(!fhinfo.slfh_name) {
+ if(!fhinfo.have_secondlevel) {
if(!check_management_access(hi, NULL, NULL)) {
reply("HSMSG_ACCESS_DENIED");
return 0;
if(new_fhinfo.parse_state == HS_FHPARSE_INVALID) {
reply("HSMSG_TOPLEVEL_INVALID", argv[1]);
return 0;
- } else if(new_fhinfo.parse_state != HS_FHPARSE_UNKNOWN && (irccasecmp(fhinfo.tlfh_name, new_fhinfo.tlfh_name) || (new_fhinfo.slfh && new_fhinfo.slfh_name && irccasecmp(fhinfo.slfh_name, new_fhinfo.slfh_name)))) {
+ } else if(new_fhinfo.parse_state != HS_FHPARSE_UNKNOWN && (irccasecmp(fhinfo.tlfh_name, new_fhinfo.tlfh_name) || (new_fhinfo.slfh && irccasecmp(fhinfo.slfh_name, new_fhinfo.slfh_name)))) {
reply("HSMSG_FAKEHOST_TOPLEVEL_ALREADY_EXISTS", new_fhinfo.slfh_name, new_fhinfo.tlfh_name);
return 0;
}
reply("HSMSG_ACCESS_DENIED");
return 0;
}
- if(new_fhinfo.slfh_name) {
+ if(fhinfo.have_secondlevel) {
//can't rename toplevel into secondlevel fakehost!
new_fhinfo.tlfh_name--;
new_fhinfo.tlfh_name[0] = '.';
return 0;
}
if(fhinfo.slfh) {
- for(manager = huser->managements; manager; manager = manager->next) {
+ for(manager = huser->managements; manager; manager = manager->unext) {
if(manager->type == 2 && manager->object == fhinfo.slfh)
break;
}
return 0;
}
} else {
- for(manager = huser->managements; manager; manager = manager->next) {
+ for(manager = huser->managements; manager; manager = manager->unext) {
if(manager->type == 1 && manager->object == fhinfo.tlfh)
break;
}