]> 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 20ba220ac1fca53f2552e63bc119fbfb0fb8f2be..08a450b48820126a600660a466bb26331c1b8b21 100644 (file)
@@ -45,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;
@@ -183,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",
@@ -211,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;
@@ -444,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.  
@@ -455,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
@@ -495,17 +523,9 @@ int send_express_message(char *lun, char *x_user, char *x_msg)
                                            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) {
@@ -563,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;
 
@@ -601,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);
@@ -658,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);
+}
 
 
 
@@ -668,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$";