diff --git a/extensions/createauthonly.cc b/extensions/createauthonly.cc index d7e52d9cf..177125d8f 100644 --- a/extensions/createauthonly.cc +++ b/extensions/createauthonly.cc @@ -24,6 +24,6 @@ h_can_create_channel_authenticated(hook_data_client_approval *data) { struct Client *source_p = data->client; - if (*source_p->user->suser == '\0' && !IsOper(source_p)) + if (source_p->user->suser.empty() && !IsOper(source_p)) data->approved = ERR_NEEDREGGEDNICK; } diff --git a/extensions/extb_account.cc b/extensions/extb_account.cc index 7513a6b04..2288821ee 100644 --- a/extensions/extb_account.cc +++ b/extensions/extb_account.cc @@ -37,7 +37,7 @@ static int eb_account(const char *data, struct Client *client_p, (void)chptr; /* $a alone matches any logged in user */ if (data == NULL) - return EmptyString(client_p->user->suser) ? NOMATCH : MATCH; + return client_p->user->suser.empty()? NOMATCH : MATCH; /* $a:MASK matches users logged in under matching account */ return match(data, client_p->user->suser) ? MATCH : NOMATCH; } diff --git a/extensions/helpops.cc b/extensions/helpops.cc index 514d7e8d6..0c24b32ad 100644 --- a/extensions/helpops.cc +++ b/extensions/helpops.cc @@ -125,7 +125,7 @@ h_hdl_stats_request(hook_data_int *hdata) { target_p = (Client *)helper_ptr->data; - if(target_p->user->away) + if (target_p->user->away.size()) continue; count++; @@ -186,7 +186,7 @@ h_hdl_whois(hook_data_client *hdata) struct Client *source_p = hdata->client; struct Client *target_p = hdata->target; - if ((target_p->umodes & UMODE_HELPOPS) && EmptyString(target_p->user->away)) + if ((target_p->umodes & UMODE_HELPOPS) && target_p->user->away.empty()) { sendto_one_numeric(source_p, RPL_WHOISHELPOP, form_str(RPL_WHOISHELPOP), target_p->name); } diff --git a/extensions/hurt.cc b/extensions/hurt.cc index 1f492631c..5a34db50f 100644 --- a/extensions/hurt.cc +++ b/extensions/hurt.cc @@ -380,7 +380,7 @@ hurt_check_event(void *arg) RB_DLINK_FOREACH_SAFE (ptr, next_ptr, hurt_state.hurt_clients.head) { client_p = (Client *)ptr->data; - if (!EmptyString(client_p->user->suser)) + if (client_p->user->suser.size()) { rb_dlinkDestroy(ptr, &hurt_state.hurt_clients); sendto_one_notice(client_p, ":HURT restriction removed for this session"); @@ -431,7 +431,7 @@ client_exit_hook(hook_data_client_exit *data) static void new_local_user_hook(struct Client *source_p) { - if (IsAnyDead(source_p) || !EmptyString(source_p->user->suser) || + if (IsAnyDead(source_p) || source_p->user->suser.size() || IsExemptKline(source_p)) return; diff --git a/extensions/restrict-unauthenticated.cc b/extensions/restrict-unauthenticated.cc index cd02da645..90e2440c4 100644 --- a/extensions/restrict-unauthenticated.cc +++ b/extensions/restrict-unauthenticated.cc @@ -22,7 +22,7 @@ hack_channel_access(void *vdata) if (!MyClient(data->client)) return; - if (EmptyString(data->client->user->suser)) + if (data->client->user->suser.empty()) data->approved = 0; } diff --git a/include/ircd/client.h b/include/ircd/client.h index 03ed6543b..ed519241c 100644 --- a/include/ircd/client.h +++ b/include/ircd/client.h @@ -53,7 +53,6 @@ struct Whowas; struct DNSReply; struct Listener; struct Client; -struct User; struct Server; struct LocalUser; struct PreClient; @@ -63,22 +62,19 @@ struct ws_ctl; typedef int SSL_OPEN_CB(struct Client *, int status); -/* - * Client structures - */ -struct User +struct user { std::map channel; std::set invited; - char *away; /* pointer to away message */ - int refcnt; /* Number of times this block is referenced */ + std::string away; + std::string suser; - char suser[NICKLEN+1]; + user(const std::string &suser = {}): suser(suser) {} }; struct Server { - struct User *user; /* who activated this connection */ + std::unique_ptr user; // who activated this connection char by[NICKLEN]; rb_dlink_list servers; rb_dlink_list users; @@ -101,7 +97,7 @@ struct Client { rb_dlink_node node; rb_dlink_node lnode; - struct User *user; /* ...defined, if this is a User */ + std::unique_ptr user; // ...defined, if this is a user struct Server *serv; /* ...defined, if this is a server */ struct Client *servptr; /* Points to server this Client is on */ struct Client *from; /* == self, if Local Client, *NEVER* NULL! */ @@ -621,16 +617,11 @@ extern int show_ip(struct Client *source_p, struct Client *target_p); extern int show_ip_conf(struct ConfItem *aconf, struct Client *source_p); extern int show_ip_whowas(struct Whowas *whowas, struct Client *source_p); -extern void free_user(struct User *, struct Client *); -extern struct User *make_user(struct Client *); extern struct Server *make_server(struct Client *); extern void close_connection(struct Client *); extern void init_uid(void); extern char *generate_uid(void); -void allocate_away(struct Client *); -void free_away(struct Client *); - uint32_t connid_get(struct Client *client_p); void connid_put(uint32_t id); void client_release_connids(struct Client *client_p); diff --git a/include/ircd/s_user.h b/include/ircd/s_user.h index de6331d8e..37d31366a 100644 --- a/include/ircd/s_user.h +++ b/include/ircd/s_user.h @@ -42,8 +42,7 @@ extern void send_umode_out(struct Client *, struct Client *, int); extern void show_lusers(struct Client *source_p); extern int register_local_user(struct Client *, struct Client *); -extern void introduce_client(struct Client *client_p, struct Client *source_p, - struct User *user, const char *nick, int use_euid); +void introduce_client(struct Client *client_p, struct Client *source_p, user &user, const char *nick, int use_euid); extern void change_nick_user_host(struct Client *target_p, const char *nick, const char *user, const char *host, int newts, const char *format, ...); diff --git a/ircd/channel.cc b/ircd/channel.cc index b446f1a90..0a8c1a506 100644 --- a/ircd/channel.cc +++ b/ircd/channel.cc @@ -292,17 +292,17 @@ chan::send_join(chan &chan, client.username, client.host, chan.name.c_str(), - EmptyString(client.user->suser)? "*" : client.user->suser, + client.user->suser.empty()? "*" : client.user->suser.c_str(), client.info); // Send away message to away-notify enabled clients. - if (client.user->away) + if (!client.user->away.empty()) sendto_channel_local_with_capability_butone(&client, ALL_MEMBERS, CLICAP_AWAY_NOTIFY, NOCAPS, &chan, ":%s!%s@%s AWAY :%s", client.name, client.username, client.host, - client.user->away); + client.user->away.c_str()); } chan::membership & @@ -817,7 +817,7 @@ chan::can_join(client *source_p, chan *chptr, const char *key, const char **forw if(chptr->mode.limit && size(chptr->members) >= ulong(chptr->mode.limit)) i = ERR_CHANNELISFULL; - if(chptr->mode.mode & mode::REGONLY && EmptyString(source_p->user->suser)) + if(chptr->mode.mode & mode::REGONLY && source_p->user->suser.empty()) i = ERR_NEEDREGGEDNICK; /* join throttling stuff --nenolod */ else if(chptr->mode.join_num > 0 && chptr->mode.join_time > 0) diff --git a/ircd/client.cc b/ircd/client.cc index 7856c801c..75e53d785 100644 --- a/ircd/client.cc +++ b/ircd/client.cc @@ -41,11 +41,8 @@ static int qs_server(struct Client *, struct Client *, struct Client *, const ch static EVH check_pings; -static rb_bh *client_heap = NULL; static rb_bh *lclient_heap = NULL; static rb_bh *pclient_heap = NULL; -static rb_bh *user_heap = NULL; -static rb_bh *away_heap = NULL; static char current_uid[IDLEN]; static uint32_t current_connid = 0; @@ -86,11 +83,8 @@ init_client(void) * start off the check ping event .. -- adrian * Every 30 seconds is plenty -- db */ - client_heap = rb_bh_create(sizeof(struct Client), CLIENT_HEAP_SIZE, "client_heap"); lclient_heap = rb_bh_create(sizeof(struct LocalUser), LCLIENT_HEAP_SIZE, "lclient_heap"); pclient_heap = rb_bh_create(sizeof(struct PreClient), PCLIENT_HEAP_SIZE, "pclient_heap"); - user_heap = rb_bh_create(sizeof(struct User), USER_HEAP_SIZE, "user_heap"); - away_heap = rb_bh_create(AWAYLEN, AWAY_HEAP_SIZE, "away_heap"); rb_event_addish("check_pings", check_pings, NULL, 30); rb_event_addish("free_exited_clients", &free_exited_clients, NULL, 4); @@ -193,7 +187,7 @@ struct Client * make_client(struct Client *from) { struct LocalUser *localClient; - struct Client *client_p(reinterpret_cast(rb_bh_alloc(client_heap))); + struct Client *client_p = new Client; if(from == NULL) { @@ -305,7 +299,7 @@ free_client(struct Client *client_p) free_local_client(client_p); free_pre_client(client_p); rb_free(client_p->certfp); - rb_bh_free(client_heap, client_p); + delete client_p; } /* @@ -776,14 +770,14 @@ update_client_exit_stats(struct Client *client_p) static void release_client_state(struct Client *client_p) { - if(client_p->user != NULL) + if (client_p->user) + client_p->user.reset(); + + if (client_p->serv) { - free_user(client_p->user, client_p); /* try this here */ - } - if(client_p->serv) - { - if(client_p->serv->user != NULL) - free_user(client_p->serv->user, client_p); + if (client_p->serv->user) + client_p->serv->user.reset(); + if(client_p->serv->fullcaps) rb_free(client_p->serv->fullcaps); rb_free(client_p->serv); @@ -1653,9 +1647,8 @@ count_local_client_memory(size_t * count, size_t * local_client_memory_used) void count_remote_client_memory(size_t * count, size_t * remote_client_memory_used) { - size_t lcount, rcount; + size_t lcount(0), rcount(0); rb_bh_usage(lclient_heap, &lcount, NULL, NULL, NULL); - rb_bh_usage(client_heap, &rcount, NULL, NULL, NULL); *count = rcount - lcount; *remote_client_memory_used = *count * (sizeof(void *) + sizeof(struct Client)); } @@ -1774,29 +1767,6 @@ show_ip_whowas(struct Whowas *whowas, struct Client *source_p) return 1; } -/* - * make_user - * - * inputs - pointer to client struct - * output - pointer to struct User - * side effects - add's an User information block to a client - * if it was not previously allocated. - */ -struct User * -make_user(struct Client *client_p) -{ - struct User *user; - - user = client_p->user; - if(!user) - { - user = (struct User *) rb_bh_alloc(user_heap); - user->refcnt = 1; - client_p->user = user; - } - return user; -} - /* * make_server * @@ -1818,66 +1788,6 @@ make_server(struct Client *client_p) return client_p->serv; } -/* - * free_user - * - * inputs - pointer to user struct - * - pointer to client struct - * output - none - * side effects - Decrease user reference count by one and release block, - * if count reaches 0 - */ -void -free_user(struct User *user, struct Client *client_p) -{ - free_away(client_p); - - if(--user->refcnt <= 0) - { - if(user->away) - rb_free((char *) user->away); - /* - * sanity check - */ - if(user->refcnt < 0 || !user->invited.empty() || !user->channel.empty()) - { - sendto_realops_snomask(SNO_GENERAL, L_ALL, - "* %p user (%s!%s@%s) %p %lu %lu %d *", - client_p, - client_p ? client_p-> - name : "", - client_p->username, - client_p->host, - user, - user->invited.size(), - user->channel.size(), - user->refcnt); - s_assert(!user->refcnt); - s_assert(user->invited.empty()); - s_assert(user->channel.empty()); - } - - rb_bh_free(user_heap, user); - } -} - -void -allocate_away(struct Client *client_p) -{ - if(client_p->user->away == NULL) - client_p->user->away = reinterpret_cast(rb_bh_alloc(away_heap)); -} - - -void -free_away(struct Client *client_p) -{ - if(client_p->user != NULL && client_p->user->away != NULL) { - rb_bh_free(away_heap, client_p->user->away); - client_p->user->away = NULL; - } -} - void init_uid(void) { diff --git a/ircd/s_serv.cc b/ircd/s_serv.cc index b0c46cc25..58f7a237f 100644 --- a/ircd/s_serv.cc +++ b/ircd/s_serv.cc @@ -599,7 +599,7 @@ burst_TS6(struct Client *client_p) IsIPSpoof(target_p) ? "0" : target_p->sockhost, target_p->id, IsDynSpoof(target_p) ? target_p->orighost : "*", - EmptyString(target_p->user->suser) ? "*" : target_p->user->suser, + target_p->user->suser.empty() ? "*" : target_p->user->suser.c_str(), target_p->info); else sendto_one(client_p, ":%s UID %s %d %ld %s %s %s %s %s :%s", @@ -619,15 +619,17 @@ burst_TS6(struct Client *client_p) if(IsDynSpoof(target_p)) sendto_one(client_p, ":%s ENCAP * REALHOST %s", use_id(target_p), target_p->orighost); - if(!EmptyString(target_p->user->suser)) + + if (!target_p->user->suser.empty()) sendto_one(client_p, ":%s ENCAP * LOGIN %s", - use_id(target_p), target_p->user->suser); + use_id(target_p), + target_p->user->suser.c_str()); } - if(ConfigFileEntry.burst_away && !EmptyString(target_p->user->away)) + if(ConfigFileEntry.burst_away && !target_p->user->away.empty()) sendto_one(client_p, ":%s AWAY :%s", use_id(target_p), - target_p->user->away); + target_p->user->away.c_str()); hclientinfo.target = target_p; call_hook(h_burst_client, &hclientinfo); diff --git a/ircd/s_user.cc b/ircd/s_user.cc index da31c6581..1677b18a4 100644 --- a/ircd/s_user.cc +++ b/ircd/s_user.cc @@ -320,7 +320,7 @@ int register_local_user(struct Client *client_p, struct Client *source_p) { struct ConfItem *aconf, *xconf; - struct User *user = source_p->user; + const auto user(source_p->user.get()); char tmpstr2[BUFSIZE]; char ipaddr[HOSTIPLEN]; char myusername[USERLEN+1]; @@ -452,7 +452,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) } } - if(IsNeedSasl(aconf) && !*user->suser) + if(IsNeedSasl(aconf) && user->suser.empty()) { ServerStats.is_ref++; sendto_one_notice(source_p, ":*** Notice -- You need to identify via SASL to use this server"); @@ -637,7 +637,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) free_pre_client(source_p); - introduce_client(client_p, source_p, user, source_p->name, 1); + introduce_client(client_p, source_p, *user, source_p->name, 1); return 0; } @@ -651,7 +651,7 @@ register_local_user(struct Client *client_p, struct Client *source_p) * from a remote connect. */ void -introduce_client(struct Client *client_p, struct Client *source_p, struct User *user, const char *nick, int use_euid) +introduce_client(struct Client *client_p, struct Client *source_p, user &user, const char *nick, int use_euid) { char ubuf[BUFSIZE]; struct Client *identifyservice_p; @@ -682,7 +682,7 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User * IsIPSpoof(source_p) ? "0" : source_p->sockhost, source_p->id, IsDynSpoof(source_p) ? source_p->orighost : "*", - EmptyString(source_p->user->suser) ? "*" : source_p->user->suser, + source_p->user->suser.empty()? "*" : source_p->user->suser.c_str(), source_p->info); sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS, @@ -705,10 +705,10 @@ introduce_client(struct Client *client_p, struct Client *source_p, struct User * use_id(source_p), source_p->orighost); } - if (!EmptyString(source_p->user->suser)) + if (!source_p->user->suser.empty()) { sendto_server(client_p, NULL, CAP_TS6, use_euid ? CAP_EUID : NOCAPS, ":%s ENCAP * LOGIN %s", - use_id(source_p), source_p->user->suser); + use_id(source_p), source_p->user->suser.c_str()); } if(MyConnect(source_p) && source_p->localClient->passwd) @@ -1523,7 +1523,7 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use ":%s!%s@%s JOIN %s", nick, user, host, chan.name.c_str()); sendto_channel_local_with_capability_butone(target_p, chan::ALL_MEMBERS, CLICAP_EXTENDED_JOIN, CLICAP_CHGHOST, &chan, ":%s!%s@%s JOIN %s %s :%s", nick, user, host, chan.name.c_str(), - EmptyString(target_p->user->suser) ? "*" : target_p->user->suser, + target_p->user->suser.empty()? "*" : target_p->user->suser.c_str(), target_p->info); if(*mode) @@ -1534,10 +1534,10 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use } /* Resend away message to away-notify enabled clients. */ - if (target_p->user->away) + if (!target_p->user->away.empty()) sendto_common_channels_local_butone(target_p, CLICAP_AWAY_NOTIFY, CLICAP_CHGHOST, ":%s!%s@%s AWAY :%s", nick, user, host, - target_p->user->away); + target_p->user->away.c_str()); sendto_common_channels_local_butone(target_p, CLICAP_CHGHOST, NOCAPS, ":%s!%s@%s CHGHOST %s %s", diff --git a/modules/cap_account_tag.cc b/modules/cap_account_tag.cc index 7aa9e2963..9a0cd9d20 100644 --- a/modules/cap_account_tag.cc +++ b/modules/cap_account_tag.cc @@ -42,8 +42,8 @@ cap_account_tag_process(hook_data *data) { struct MsgBuf *msgbuf = (MsgBuf *)data->arg1; - if (data->client != NULL && IsPerson(data->client) && *data->client->user->suser) - msgbuf_append_tag(msgbuf, "account", data->client->user->suser, CLICAP_ACCOUNT_TAG); + if (data->client != NULL && IsPerson(data->client) && !data->client->user->suser.empty()) + msgbuf_append_tag(msgbuf, "account", data->client->user->suser.c_str(), CLICAP_ACCOUNT_TAG); } DECLARE_MODULE_AV2(cap_account_tag, NULL, NULL, NULL, NULL, cap_account_tag_hfnlist, cap_account_tag_cap_list, NULL, cap_account_tag_desc); diff --git a/modules/core/m_message.cc b/modules/core/m_message.cc index e6d992f23..220172f1e 100644 --- a/modules/core/m_message.cc +++ b/modules/core/m_message.cc @@ -787,9 +787,9 @@ msg_client(enum message_type msgtype, return; } - if(MyConnect(source_p) && (msgtype != MESSAGE_TYPE_NOTICE) && target_p->user && target_p->user->away) + if(MyConnect(source_p) && (msgtype != MESSAGE_TYPE_NOTICE) && target_p->user && target_p->user->away.size()) sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY), - target_p->name, target_p->user->away); + target_p->name, target_p->user->away.c_str()); if(MyClient(target_p)) { @@ -818,7 +818,7 @@ msg_client(enum message_type msgtype, /* XXX Controversial? allow opers always to send through a +g */ if(!IsServer(source_p) && (IsSetCallerId(target_p) || - (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0]))) + (IsSetRegOnlyMsg(target_p) && source_p->user->suser.empty()))) { /* Here is the anti-flood bot/spambot code -db */ if(accept_message(source_p, target_p) || IsOper(source_p)) @@ -829,7 +829,7 @@ msg_client(enum message_type msgtype, source_p->username, source_p->host, cmdname[msgtype], target_p->name, text); } - else if (IsSetRegOnlyMsg(target_p) && !source_p->user->suser[0]) + else if (IsSetRegOnlyMsg(target_p) && source_p->user->suser.empty()) { if (msgtype != MESSAGE_TYPE_NOTICE) sendto_one_numeric(source_p, ERR_NONONREG, diff --git a/modules/core/m_nick.cc b/modules/core/m_nick.cc index dda482f1f..5985bfc32 100644 --- a/modules/core/m_nick.cc +++ b/modules/core/m_nick.cc @@ -990,13 +990,12 @@ register_client(struct Client *client_p, struct Client *server, const char *nick, time_t newts, int parc, const char *parv[]) { struct Client *source_p; - struct User *user; struct nd_entry *nd; const char *m; int flag; source_p = make_client(client_p); - user = make_user(source_p); + source_p->user.reset(new user); rb_dlinkAddTail(source_p, &source_p->node, &global_client_list); source_p->hopcount = atoi(parv[2]); @@ -1020,7 +1019,7 @@ register_client(struct Client *client_p, struct Client *server, SetDynSpoof(source_p); } if (strcmp(parv[10], "*")) - rb_strlcpy(source_p->user->suser, parv[10], sizeof(source_p->user->suser)); + source_p->user->suser = parv[10]; } else if(parc == 10) { @@ -1094,7 +1093,7 @@ register_client(struct Client *client_p, struct Client *server, call_hook(h_new_remote_user, source_p); - introduce_client(client_p, source_p, user, nick, parc == 12); + introduce_client(client_p, source_p, *source_p->user, nick, parc == 12); } /* Check if we can do SAVE. target_p can be a client to save or a diff --git a/modules/m_away.cc b/modules/m_away.cc index f14e8fe63..c5265abee 100644 --- a/modules/m_away.cc +++ b/modules/m_away.cc @@ -68,12 +68,11 @@ m_away(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p if(parc < 2 || EmptyString(parv[1])) { /* Marking as not away */ - if(source_p->user->away != NULL) + if(source_p->user->away.size()) { /* we now send this only if they were away before --is */ sendto_server(client_p, NULL, CAP_TS6, NOCAPS, ":%s AWAY", use_id(source_p)); - free_away(source_p); sendto_common_channels_local_butone(source_p, CLICAP_AWAY_NOTIFY, NOCAPS, ":%s!%s@%s AWAY", source_p->name, source_p->username, source_p->host); @@ -101,20 +100,25 @@ m_away(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p ConfigFileEntry.away_interval; } - if(source_p->user->away == NULL) - allocate_away(source_p); - if(strncmp(source_p->user->away, parv[1], AWAYLEN - 1)) + std::string p1(parv[1]); + if (p1.size() >= AWAYLEN) + p1.resize(AWAYLEN-1); + + if (source_p->user->away != p1) { - rb_strlcpy(source_p->user->away, parv[1], AWAYLEN); + source_p->user->away = std::move(p1); sendto_server(client_p, NULL, CAP_TS6, NOCAPS, - ":%s AWAY :%s", use_id(source_p), source_p->user->away); + ":%s AWAY :%s", + use_id(source_p), + source_p->user->away.c_str()); + sendto_common_channels_local_butone(source_p, CLICAP_AWAY_NOTIFY, NOCAPS, ":%s!%s@%s AWAY :%s", source_p->name, source_p->username, source_p->host, - source_p->user->away); + source_p->user->away.c_str()); } if(MyConnect(source_p)) diff --git a/modules/m_invite.cc b/modules/m_invite.cc index 273a635be..a09d12299 100644 --- a/modules/m_invite.cc +++ b/modules/m_invite.cc @@ -142,7 +142,7 @@ m_invite(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source * for +l/+j just check if the mode is set, this varies over time */ if(chptr->mode.mode & chan::mode::INVITEONLY || - (chptr->mode.mode & chan::mode::REGONLY && EmptyString(target_p->user->suser)) || + (chptr->mode.mode & chan::mode::REGONLY && target_p->user->suser.empty()) || chptr->mode.limit || chptr->mode.join_num) store_invite = 1; @@ -159,9 +159,9 @@ m_invite(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source sendto_one(source_p, form_str(RPL_INVITING), me.name, source_p->name, target_p->name, parv[2]); - if(target_p->user->away) + if(target_p->user->away.size()) sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY), - target_p->name, target_p->user->away); + target_p->name, target_p->user->away.c_str()); } /* invite timestamp */ else if(parc > 3 && !EmptyString(parv[3])) diff --git a/modules/m_services.cc b/modules/m_services.cc index af513e99d..143b1bff5 100644 --- a/modules/m_services.cc +++ b/modules/m_services.cc @@ -115,13 +115,13 @@ me_su(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, return; if(EmptyString(parv[2])) - target_p->user->suser[0] = '\0'; + target_p->user->suser.clear(); else - rb_strlcpy(target_p->user->suser, parv[2], sizeof(target_p->user->suser)); + target_p->user->suser = parv[2]; sendto_common_channels_local_butone(target_p, CLICAP_ACCOUNT_NOTIFY, NOCAPS, ":%s!%s@%s ACCOUNT %s", target_p->name, target_p->username, target_p->host, - EmptyString(target_p->user->suser) ? "*" : target_p->user->suser); + target_p->user->suser.empty()? "*" : target_p->user->suser.c_str()); chan::invalidate_bancache_user(target_p); } @@ -133,7 +133,7 @@ me_login(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source if(!IsPerson(source_p)) return; - rb_strlcpy(source_p->user->suser, parv[1], sizeof(source_p->user->suser)); + source_p->user->suser = parv[1]; } static void @@ -293,22 +293,25 @@ h_svc_server_introduced(hook_data_client *hdata) static void h_svc_whois(hook_data_client *data) { - char *p = data->target->user->suser; - if(!EmptyString(p)) - { - /* Try to strip off any leading digits as this may be used to - * store both an ID number and an account name in one field. - * If only digits are present, leave as is. - */ - while(rfc1459::is_digit(*p)) - p++; - if(*p == '\0') - p = data->target->user->suser; + const auto &suser(data->target->user->suser); + if (suser.empty()) + return; - sendto_one_numeric(data->client, RPL_WHOISLOGGEDIN, - form_str(RPL_WHOISLOGGEDIN), - data->target->name, p); - } + /* Try to strip off any leading digits as this may be used to + * store both an ID number and an account name in one field. + * If only digits are present, leave as is. + */ + const char *p(suser.c_str()); + while(rfc1459::is_digit(*p)) + p++; + + if(*p == '\0') + p = suser.c_str(); + + sendto_one_numeric(data->client, RPL_WHOISLOGGEDIN, + form_str(RPL_WHOISLOGGEDIN), + data->target->name, + p); } static void diff --git a/modules/m_signon.cc b/modules/m_signon.cc index c06f9e9c8..3373ad1c0 100644 --- a/modules/m_signon.cc +++ b/modules/m_signon.cc @@ -144,7 +144,7 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou if(*parv[5] == '*') { if(target_p->user) - rb_strlcpy(login, target_p->user->suser, NICKLEN + 1); + rb_strlcpy(login, target_p->user->suser.c_str(), NICKLEN + 1); else login[0] = '\0'; } @@ -199,8 +199,6 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou if(IsUnknown(target_p)) { - struct User *user_p = make_user(target_p); - if(valid & NICK_VALID) rb_strlcpy(target_p->preClient->spoofnick, nick, sizeof(target_p->preClient->spoofnick)); @@ -210,7 +208,7 @@ me_svslogin(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sou if(valid & HOST_VALID) rb_strlcpy(target_p->preClient->spoofhost, host, sizeof(target_p->preClient->spoofhost)); - rb_strlcpy(user_p->suser, login, NICKLEN + 1); + target_p->user = std::make_unique(login); } else { @@ -391,7 +389,7 @@ send_signon(struct Client *client_p, struct Client *target_p, use_id(target_p), nick, user, host, (long) target_p->tsinfo, *login ? login : "0"); - rb_strlcpy(target_p->user->suser, login, sizeof(target_p->user->suser)); + target_p->user->suser = login; change_nick_user_host(target_p, nick, user, host, newts, "Signing %s (%s)", *login ? "in" : "out", nick); } diff --git a/modules/m_stats.cc b/modules/m_stats.cc index 8f181f5db..c805eb249 100644 --- a/modules/m_stats.cc +++ b/modules/m_stats.cc @@ -836,7 +836,7 @@ stats_operedup (struct Client *source_p) if(IsOperInvis(target_p) && !IsOper(source_p)) continue; - if(target_p->user->away) + if(target_p->user->away.size()) continue; count++; @@ -1337,10 +1337,10 @@ stats_memory (struct Client *source_p) users_counted++; users_invited_count += target_p->user->invited.size(); user_channels += target_p->user->channel.size(); - if(target_p->user->away) + if(target_p->user->away.size()) { aways_counted++; - away_memory += (strlen(target_p->user->away) + 1); + away_memory += target_p->user->away.size() + 1; } } } @@ -1377,7 +1377,7 @@ stats_memory (struct Client *source_p) sendto_one_numeric(source_p, RPL_STATSDEBUG, "z :Users %u(%lu) Invites %u(%lu)", users_counted, - (unsigned long) users_counted * sizeof(struct User), + (unsigned long) users_counted * sizeof(struct user), users_invited_count, (unsigned long) users_invited_count * sizeof(rb_dlink_node)); diff --git a/modules/m_user.cc b/modules/m_user.cc index 022c27bb8..0391468db 100644 --- a/modules/m_user.cc +++ b/modules/m_user.cc @@ -78,7 +78,7 @@ do_local_user(struct Client *client_p, struct Client *source_p, s_assert(NULL != source_p); s_assert(source_p->username != username); - make_user(source_p); + source_p->user.reset(new user); source_p->flags |= FLAGS_SENTUSER; diff --git a/modules/m_userhost.cc b/modules/m_userhost.cc index 7cc385cfb..095cb62b6 100644 --- a/modules/m_userhost.cc +++ b/modules/m_userhost.cc @@ -76,7 +76,7 @@ m_userhost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sour rl = sprintf(response, "%s%s=%c%s@%s ", target_p->name, IsOper(target_p) ? "*" : "", - (target_p->user->away) ? '-' : '+', + (target_p->user->away.size())? '-' : '+', target_p->username, target_p->sockhost); } @@ -85,7 +85,7 @@ m_userhost(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *sour rl = sprintf(response, "%s%s=%c%s@%s ", target_p->name, IsOper(target_p) ? "*" : "", - (target_p->user->away) ? '-' : '+', + (target_p->user->away.size())? '-' : '+', target_p->username, target_p->host); } diff --git a/modules/m_who.cc b/modules/m_who.cc index bb9794823..26da51d81 100644 --- a/modules/m_who.cc +++ b/modules/m_who.cc @@ -464,7 +464,7 @@ do_who(struct Client *source_p, struct Client *target_p, chan::chan *chan, chan: const char *q; sprintf(status, "%c%s%s", - target_p->user->away ? 'G' : 'H', IsOper(target_p) ? "*" : "", msptr ? find_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : ""); + target_p->user->away.size()? 'G' : 'H', IsOper(target_p) ? "*" : "", msptr ? find_status(msptr, fmt->fields || IsCapable(source_p, CLICAP_MULTI_PREFIX)) : ""); if (fmt->fields == 0) sendto_one(source_p, form_str(RPL_WHOREPLY), me.name, @@ -507,13 +507,13 @@ do_who(struct Client *source_p, struct Client *target_p, chan::chan *chan, chan: if (fmt->fields & FIELD_ACCOUNT) { /* display as in whois */ - q = target_p->user->suser; + q = target_p->user->suser.c_str(); if (!EmptyString(q)) { while(rfc1459::is_digit(*q)) q++; if(*q == '\0') - q = target_p->user->suser; + q = target_p->user->suser.c_str(); } else q = "0"; diff --git a/modules/m_whois.cc b/modules/m_whois.cc index 41e0aec3e..e94bd5f91 100644 --- a/modules/m_whois.cc +++ b/modules/m_whois.cc @@ -288,9 +288,9 @@ single_whois(struct Client *source_p, struct Client *target_p, int operspy) target_p->name, target_p->servptr->name, target_p->servptr->info); - if(target_p->user->away) + if(target_p->user->away.size()) sendto_one_numeric(source_p, RPL_AWAY, form_str(RPL_AWAY), - target_p->name, target_p->user->away); + target_p->name, target_p->user->away.c_str()); if(IsOper(target_p) && (!ConfigFileEntry.hide_opers_in_whois || IsOper(source_p))) {