X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frwho%2Fserv_rwho.c;h=3d60b1a5a4be4e341961eb587cd5f05b1dc174a9;hb=8c47559cb5ae97ec0fa35660ee16fd61a9451c72;hp=16746dfe9f00d082a784c3504817f1ad28e9b3ff;hpb=84a0666848ccbea920f0bd398baf149c1a12ea74;p=citadel.git diff --git a/citadel/modules/rwho/serv_rwho.c b/citadel/modules/rwho/serv_rwho.c index 16746dfe9..3d60b1a5a 100644 --- a/citadel/modules/rwho/serv_rwho.c +++ b/citadel/modules/rwho/serv_rwho.c @@ -1,9 +1,24 @@ /* * $Id$ * - * This module implementsserver commands related to the display and + * This module implements server commands related to the display and * manipulation of the "Who's online" list. * + * Copyright (c) 1987-2009 by the citadel.org team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -51,7 +66,8 @@ * display who's online */ void cmd_rwho(char *argbuf) { - struct CitContext *cptr; + struct CitContext *nptr; + int nContexts, i; int spoofed = 0; int user_spoofed = 0; int room_spoofed = 0; @@ -61,10 +77,24 @@ void cmd_rwho(char *argbuf) { char real_room[ROOMNAMELEN], room[ROOMNAMELEN]; char host[64], flags[5]; + /* So that we don't keep the context list locked for a long time + * we create a copy of it first + */ + + + nptr = CtdlGetContextArray(&nContexts) ; + if (!nptr) + { + /* Couldn't malloc so we have to bail but stick to the protocol */ + cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() ); + cprintf("000\n"); + return; + } + aide = CC->user.axlevel >= 6; cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() ); - for (cptr = ContextList; cptr != NULL; cptr = cptr->next) + for (i=0; ics_flags & CS_POSTING) + if (nptr[i].cs_flags & CS_POSTING) strcat(flags, "*"); else strcat(flags, "."); - if (cptr->fake_username[0]) + if (nptr[i].fake_username[0]) { - strcpy(un, cptr->fake_username); + strcpy(un, nptr[i].fake_username); spoofed = 1; user_spoofed = 1; } else - strcpy(un, cptr->curr_user); + strcpy(un, nptr[i].curr_user); - if (cptr->fake_hostname[0]) + if (nptr[i].fake_hostname[0]) { - strcpy(host, cptr->fake_hostname); + strcpy(host, nptr[i].fake_hostname); spoofed = 1; host_spoofed = 1; } else - strcpy(host, cptr->cs_host); + strcpy(host, nptr[i].cs_host); - GenerateRoomDisplay(real_room, cptr, CC); + GenerateRoomDisplay(real_room, &nptr[i], CC); - if (cptr->fake_roomname[0]) { - strcpy(room, cptr->fake_roomname); + if (nptr[i].fake_roomname[0]) { + strcpy(room, nptr[i].fake_roomname); spoofed = 1; room_spoofed = 1; } @@ -110,21 +140,21 @@ void cmd_rwho(char *argbuf) { strcat(flags, "+"); } - if ((cptr->cs_flags & CS_STEALTH) && (aide)) { + if ((nptr[i].cs_flags & CS_STEALTH) && (aide)) { strcat(flags, "-"); } - if (((cptr->cs_flags&CS_STEALTH)==0) || (aide)) + if (((nptr[i].cs_flags&CS_STEALTH)==0) || (aide)) { cprintf("%d|%s|%s|%s|%s|%ld|%s|%s|", - cptr->cs_pid, un, room, - host, cptr->cs_clientname, - (long)(cptr->lastidle), - cptr->lastcmdname, flags + nptr[i].cs_pid, un, room, + host, nptr[i].cs_clientname, + (long)(nptr[i].lastidle), + nptr[i].lastcmdname, flags ); if ((user_spoofed) && (aide)) { - cprintf("%s|", cptr->curr_user); + cprintf("%s|", nptr[i].curr_user); } else { cprintf("|"); @@ -138,15 +168,18 @@ void cmd_rwho(char *argbuf) { } if ((host_spoofed) && (aide)) { - cprintf("%s|", cptr->cs_host); + cprintf("%s|", nptr[i].cs_host); } else { cprintf("|"); } - cprintf("%d\n", cptr->logged_in); + cprintf("%d\n", nptr[i].logged_in); } } + + /* release out copy of the context list */ + free(nptr); /* Now it's magic time. Before we finish, call any EVT_RWHO hooks * so that external paging modules such as serv_icq can add more @@ -154,7 +187,7 @@ void cmd_rwho(char *argbuf) { */ PerformSessionHooks(EVT_RWHO); cprintf("000\n"); - } +} /* @@ -238,9 +271,11 @@ void cmd_stel(char *cmdbuf) if (requested_mode == 1) { CC->cs_flags = CC->cs_flags | CS_STEALTH; + PerformSessionHooks(EVT_STEALTH); } if (requested_mode == 0) { CC->cs_flags = CC->cs_flags & ~CS_STEALTH; + PerformSessionHooks(EVT_UNSTEALTH); } cprintf("%d %d\n", CIT_OK, @@ -248,11 +283,6 @@ void cmd_stel(char *cmdbuf) } - - - - - CTDL_MODULE_INIT(rwho) { if(!threading)