+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]) && fakehost[i] != '.' && !(fakehost[i] == '*' && i == 0) && !strchr(HS_FAKEHOST_SPECIAL_CHARS, fakehost[i])) {
+ fhinfo.parse_state = HS_FHPARSE_INVALID;
+ return fhinfo;
+ }
+ }
+ fhinfo.slfh_name = fakehost;
+ fhinfo.tlfh_name = strchr(fakehost, '.');
+ if(!fhinfo.tlfh_name) {
+ fhinfo.parse_state = HS_FHPARSE_INVALID;
+ return fhinfo;
+ }
+ fhinfo.tlfh_name[0] = '\0';
+ fhinfo.tlfh_name++;
+ if(strchr(fhinfo.tlfh_name, '.')) {
+ fhinfo.parse_state = HS_FHPARSE_INVALID;
+ fhinfo.tlfh_name--;
+ fhinfo.tlfh_name[0] = '\0';
+ return fhinfo;
+ }
+ if(irccasecmp(fhinfo.slfh_name, "*"))
+ fhinfo.have_secondlevel = 1;
+ struct hs_toplevel *tlfh;
+ struct hs_secondlevel *slfh;
+ for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
+ if(!irccasecmp(tlfh->fakehost, fhinfo.tlfh_name)) break;
+ }
+ fhinfo.tlfh = tlfh;
+ if(!tlfh) {
+ fhinfo.slfh = NULL;
+ fhinfo.parse_state = HS_FHPARSE_UNKNOWN;
+ return fhinfo;
+ }
+ if(fhinfo.have_secondlevel) {
+ for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
+ if(!irccasecmp(slfh->fakehost, fhinfo.slfh_name)) break;
+ }
+ fhinfo.slfh = slfh;
+ if(!slfh) {
+ fhinfo.parse_state = HS_FHPARSE_UNKNOWN;
+ return fhinfo;
+ }
+ } else
+ fhinfo.slfh = NULL;
+ if(fix_name_case) {
+ //simply copy the stored fakehosts over the given ones
+ strcpy(fhinfo.tlfh_name, fhinfo.tlfh->fakehost);
+ if(fhinfo.slfh)
+ strcpy(fhinfo.slfh_name, fhinfo.slfh->fakehost);
+ }
+ fhinfo.parse_state = HS_FHPARSE_SUCCESS;
+ return fhinfo;
+}
+
+