]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_chat.c
* The size constant "256" which shows up everywhere as a buffer size has now
[citadel.git] / citadel / serv_chat.c
index 326d123554d59c07aa8c44e1c3ad77cef42ca09f..08a450b48820126a600660a466bb26331c1b8b21 100644 (file)
@@ -15,6 +15,9 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/time.h>
+#ifdef TIME_WITH_SYS_TIME
+#include <time.h>
+#endif
 #include <sys/wait.h>
 #include <string.h>
 #include <limits.h>
@@ -42,7 +45,7 @@ extern struct CitContext *ContextList;
 void allwrite(char *cmdbuf, int flag, char *username)
 {
        FILE *fp;
-       char bcast[256];
+       char bcast[SIZ];
        char *un;
        struct ChatLine *clptr, *clnew;
        time_t now;
@@ -98,16 +101,11 @@ void allwrite(char *cmdbuf, int flag, char *username)
        }
 
        /* Then, before releasing the lock, free the expired messages */
-       while (1) {
-               if (ChatQueue == NULL)
-                       goto DONE_FREEING;
-               if ((now - ChatQueue->chat_time) < 120L)
-                       goto DONE_FREEING;
+       while ((ChatQueue != NULL) && (now - ChatQueue->chat_time >= 120L)) {
                clptr = ChatQueue;
                ChatQueue = ChatQueue->next;
                phree(clptr);
        }
-DONE_FREEING:
        end_critical_section(S_CHATQUEUE);
 }
 
@@ -185,6 +183,12 @@ void do_chat_listing(int allflag)
                cprintf(":|\n:| Users not in chat:\n");
                for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) {
 
+                       GenerateRoomDisplay(roomname, ccptr, CC);
+                       if ((CC->usersupp.axlevel < 6)
+                       && (strlen(ccptr->fake_roomname)>0)) {
+                               strcpy(roomname, ccptr->fake_roomname);
+                       }
+
                        if (((ccptr->cs_flags & CS_CHAT) == 0)
                            && ((ccptr->cs_flags & CS_STEALTH) == 0)) {
                                cprintf(":| %-25s <%s>:\n",
@@ -213,7 +217,7 @@ void do_chat_listing(int allflag)
 
 void cmd_chat(char *argbuf)
 {
-       char cmdbuf[256];
+       char cmdbuf[SIZ];
        char *un;
        char *strptr1;
        int MyLastMsg, ThisLastMsg;
@@ -446,6 +450,28 @@ void cmd_gexp(char *argbuf) {
 }
 
 
+/*
+ * Back end support function for send_express_message() and company
+ */
+void add_xmsg_to_context(struct CitContext *ccptr, 
+                       struct ExpressMessage *newmsg) 
+{
+       struct ExpressMessage *findend;
+
+       if (ccptr->FirstExpressMessage == NULL) {
+               ccptr->FirstExpressMessage = newmsg;
+       }
+       else {
+               findend = ccptr->FirstExpressMessage;
+               while (findend->next != NULL) {
+                       findend = findend->next;
+               }
+               findend->next = newmsg;
+       }
+}
+
+
+
 
 /* 
  * This is the back end to the express message sending function.  
@@ -457,7 +483,7 @@ int send_express_message(char *lun, char *x_user, char *x_msg)
        int message_sent = 0;           /* number of successful sends */
 
        struct CitContext *ccptr;
-       struct ExpressMessage *newmsg, *findend;
+       struct ExpressMessage *newmsg;
        char *un;
        size_t msglen = 0;
        int do_send = 0;                /* set to 1 to actually page, not
@@ -492,21 +518,14 @@ int send_express_message(char *lun, char *x_user, char *x_msg)
                                        mallok(sizeof (struct ExpressMessage));
                                memset(newmsg, 0,
                                        sizeof (struct ExpressMessage));
+                               time(&(newmsg->timestamp));
                                safestrncpy(newmsg->sender, lun,
                                            sizeof newmsg->sender);
                                if (!strcasecmp(x_user, "broadcast"))
                                        newmsg->flags |= EM_BROADCAST;
-                               newmsg->text = mallok(msglen);
-                               safestrncpy(newmsg->text, x_msg, msglen);
-
-                               if (ccptr->FirstExpressMessage == NULL)
-                                       ccptr->FirstExpressMessage = newmsg;
-                               else {
-                                       findend = ccptr->FirstExpressMessage;
-                                       while (findend->next != NULL)
-                                               findend = findend->next;
-                                       findend->next = newmsg;
-                               }
+                               newmsg->text = strdoop(x_msg);
+
+                               add_xmsg_to_context(ccptr, newmsg);
 
                                /* and log it ... */
                                if (ccptr != CC) {
@@ -564,8 +583,8 @@ int send_express_message(char *lun, char *x_user, char *x_msg)
 void cmd_sexp(char *argbuf)
 {
        int message_sent = 0;
-       char x_user[256];
-       char x_msg[256];
+       char x_user[SIZ];
+       char x_msg[SIZ];
        char *lun;              /* <bc> */
        char *x_big_msgbuf = NULL;
 
@@ -602,8 +621,8 @@ void cmd_sexp(char *argbuf)
                }
                cprintf("%d Transmit message (will deliver to %d users)\n",
                        SEND_LISTING, message_sent);
-               x_big_msgbuf = mallok(256);
-               memset(x_big_msgbuf, 0, 256);
+               x_big_msgbuf = mallok(SIZ);
+               memset(x_big_msgbuf, 0, SIZ);
                while (client_gets(x_msg), strcmp(x_msg, "000")) {
                        x_big_msgbuf = reallok(x_big_msgbuf,
                               strlen(x_big_msgbuf) + strlen(x_msg) + 4);
@@ -659,6 +678,40 @@ void cmd_dexp(char *argbuf)
        }
 
 
+/*
+ * Request client termination
+ */
+void cmd_reqt(char *argbuf) {
+       struct CitContext *ccptr;
+       int sessions = 0;
+       int which_session;
+       struct ExpressMessage *newmsg;
+
+       if (CtdlAccessCheck(ac_aide)) return;
+       which_session = extract_int(argbuf, 0);
+
+       begin_critical_section(S_SESSION_TABLE);
+       for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) {
+               if ((ccptr->cs_pid == which_session) || (which_session == 0)) {
+
+                       newmsg = (struct ExpressMessage *)
+                               mallok(sizeof (struct ExpressMessage));
+                       memset(newmsg, 0,
+                               sizeof (struct ExpressMessage));
+                       time(&(newmsg->timestamp));
+                       safestrncpy(newmsg->sender, CC->usersupp.fullname,
+                                   sizeof newmsg->sender);
+                       newmsg->flags |= EM_GO_AWAY;
+                       newmsg->text = strdoop("Automatic logoff requested.");
+
+                       add_xmsg_to_context(ccptr, newmsg);
+                       ++sessions;
+
+               }
+       }
+       end_critical_section(S_SESSION_TABLE);
+       cprintf("%d Sent termination request to %d sessions.\n", OK, sessions);
+}
 
 
 
@@ -669,6 +722,7 @@ char *Dynamic_Module_Init(void)
        CtdlRegisterProtoHook(cmd_gexp, "GEXP", "Get express messages");
        CtdlRegisterProtoHook(cmd_sexp, "SEXP", "Send an express message");
        CtdlRegisterProtoHook(cmd_dexp, "DEXP", "Disable express messages");
+       CtdlRegisterProtoHook(cmd_reqt, "REQT", "Request client termination");
        CtdlRegisterSessionHook(delete_express_messages, EVT_STOP);
        CtdlRegisterXmsgHook(send_express_message, XMSG_PRI_LOCAL);
        return "$Id$";