extern int realm_set_name(t_realm * realm, char const * name) { char const * temp; t_realm const * temprealm; if (!realm) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL realm"); return -1; } if (name && (temprealm=realmlist_find_realm(name))) { if (temprealm == realm) return 0; else { eventlog(eventlog_level_error,__FUNCTION__,"realm %s does already exist in list",name); return -1; } } if (name) temp=xstrdup(name); else temp = NULL; if (realm->name) xfree((void *)realm->name); /* avoid warning */ realm->name = temp; return 0; }
static int on_d2cs_authreply(t_connection * c, t_packet const * packet) { t_packet * rpacket; unsigned int version; unsigned int try_version; unsigned int reply; char const * realmname; t_realm * realm; if (packet_get_size(packet)<sizeof(t_d2cs_bnetd_authreply)) { eventlog(eventlog_level_error,__FUNCTION__,"got bad packet size"); return -1; } if (!(realmname=packet_get_str_const(packet,sizeof(t_d2cs_bnetd_authreply),REALM_NAME_LEN))) { eventlog(eventlog_level_error,__FUNCTION__,"got bad realmname"); return -1; } if (!(realm=realmlist_find_realm(realmname))) { realm=realmlist_find_realm_by_ip(conn_get_addr(c)); /* should not fail - checked in handle_init_packet() handle_init.c */ eventlog(eventlog_level_warn,__FUNCTION__, "warn: realm name mismatch %s %s", realm_get_name(realm), realmname); if (!(prefs_allow_d2cs_setname())) { /* fail if allow_d2cs_setname = false */ eventlog(eventlog_level_error,__FUNCTION__, "d2cs not allowed to set realm name"); return -1; } if (realm_get_active(realm)) { /* fail if realm already active */ eventlog(eventlog_level_error,__FUNCTION__, "cannot set realm name to %s (realm already active)",realmname); return -1; } realm_set_name(realm,realmname); } version=prefs_get_d2cs_version(); try_version=bn_int_get(packet->u.d2cs_bnetd_authreply.version); if (version && version != try_version) { eventlog(eventlog_level_error,__FUNCTION__,"d2cs version mismatch 0x%X - 0x%X", try_version,version); reply=BNETD_D2CS_AUTHREPLY_BAD_VERSION; } else { reply=BNETD_D2CS_AUTHREPLY_SUCCEED; } if (reply==BNETD_D2CS_AUTHREPLY_SUCCEED) { eventlog(eventlog_level_info,__FUNCTION__,"d2cs %s authed", addr_num_to_ip_str(conn_get_addr(c))); conn_set_state(c,conn_state_loggedin); realm_active(realm,c); } else { eventlog(eventlog_level_error,__FUNCTION__,"failed to auth d2cs %s", addr_num_to_ip_str(conn_get_addr(c))); } if ((rpacket=packet_create(packet_class_d2cs_bnetd))) { packet_set_size(rpacket,sizeof(t_bnetd_d2cs_authreply)); packet_set_type(rpacket,BNETD_D2CS_AUTHREPLY); bn_int_set(&rpacket->u.bnetd_d2cs_authreply.h.seqno,1); bn_int_set(&rpacket->u.bnetd_d2cs_authreply.reply,reply); conn_push_outqueue(c,rpacket); packet_del_ref(rpacket); } return 0; }
extern int realm_set_name(t_realm * realm, char const * name) { char const * temp; t_realm const * temprealm; if (!realm) { eventlog(eventlog_level_error,"realm_set_name","got NULL realm"); return -1; } if (name && (temprealm=realmlist_find_realm(name))) { if (temprealm == realm) return 0; else { eventlog(eventlog_level_error,"realm_set_name","realm %s does already exist in list",name); return -1; } } if (name) { if (!(temp=strdup(name))) { eventlog(eventlog_level_error,"realm_set_name","could not allocate memory for new realmname"); return -1; } } else temp = NULL; if (realm->name) free((void *)realm->name); /* avoid warning */ realm->name = temp; return 0; }