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;
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",
void cmd_chat(char *argbuf)
{
- char cmdbuf[256];
+ char cmdbuf[SIZ];
char *un;
char *strptr1;
int MyLastMsg, ThisLastMsg;
}
+/*
+ * 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.
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
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) {
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;
}
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);
}
+/*
+ * 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);
+}
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$";