+flag_t getservertype(server *server) {
+ flag_t result = 0;
+ char *server_name;
+ int server_len;
+
+ if(server == NULL || server->name == NULL)
+ return 0;
+
+ server_name = server->name->content;
+ server_len = server->name->length;
+
+ if(server->flags & SMODE_SERVICE)
+ result|=SERVERTYPEFLAG_SERVICE;
+
+ if(!strcmp(server_name, q_server->content)) {
+ result|=SERVERTYPEFLAG_CHANSERV;
+ result|=SERVERTYPEFLAG_CRITICAL_SERVICE;
+ } else if(!strcmp(server_name, s_server->content)) {
+ result|=SERVERTYPEFLAG_SPAMSCAN;
+ result|=SERVERTYPEFLAG_CRITICAL_SERVICE;
+ } else {
+ if(service_re && (pcre_exec(service_re, NULL, server_name, server_len, 0, 0, NULL, 0) >= 0)) {
+ /* matches service re */
+ if((server->flags & SMODE_SERVICE) == 0) {
+ /* is not a service */
+ Error("serverlist", ERR_WARNING, "Non-service server (%s) matched service RE.", server_name);
+ }
+ } else {
+ /* does not match service re */
+ if((server->flags & SMODE_SERVICE) != 0) {
+ result|=SERVERTYPEFLAG_SERVICE;
+ Error("serverlist", ERR_WARNING, "Service server (%s) that does not match service RE.", server_name);
+ }
+ }
+ }
+
+ if(hub_re && (pcre_exec(hub_re, NULL, server_name, server_len, 0, 0, NULL, 0) >= 0)) {
+ if((server->flags & SMODE_HUB) != 0) {
+ result|=SERVERTYPEFLAG_HUB;
+ } else {
+ Error("serverlist", ERR_WARNING, "Server matched hub re but isn't a hub (%s).", server_name);
+ }
+ }
+
+ if(not_client_re && (pcre_exec(not_client_re, NULL, server_name, server_len, 0, 0, NULL, 0) >= 0)) {
+ /* noop */
+ } else if(result == 0) {
+ result|=SERVERTYPEFLAG_CLIENT_SERVER;
+ }
+
+ return result;
+}