Commit b1196d3a authored by Andrew Price's avatar Andrew Price
Browse files

js-duk: Implement exit events

Replaces bind(K_BIND_SHUTDOWN, ...)

    function handler(ev)
    {
            switch (ev.type) {
            ...
            case "exit":
                    mrodder = ev.data;
                    if (mrodder)
                            mw.print("Your mw session was killed by " + mrodder);
                    break;
            ...
            }
    }
    mw.onevent.push(handler);
parent 5b49d551
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ typedef enum {
	MWEV_TYPE_MSG,
	MWEV_TYPE_ONOFF,
	MWEV_TYPE_INPUT,
	MWEV_TYPE_EXIT,
} mwev_type_t;

struct mwevent {
@@ -16,6 +17,7 @@ struct mwevent {
		ipc_message_t *msg;   /* MWEV_TYPE_MSG */
		ipc_message_t *onoff; /* MWEV_TYPE_ONOFF */
		const char *input;    /* MWEV_TYPE_INPUT */
		const char *mrodder;  /* MWEV_TYPE_EXIT */
	} ev_data;
};

+0 −5
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ extern ipc_connection_t *ipcsock;

int new_mail_waiting=0;
int mesg_waiting = 0;
char *mrod_user=NULL;

static int MesgStacked=0;
static struct mstack *MesgStack=NULL;
@@ -1006,10 +1005,6 @@ static void mrod(char *from, char *msg)
		display_message(mrod_message, 1, 1);
	}
	fflush(stdout);

	fix_terminal();

	mrod_user = malloc(sizeof(char) * (strlen(from) + 1));
	strcpy(mrod_user, from);
	close_down(LOGOFF_MROD, from, msg);
}
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ struct mstack
};

extern int new_mail_waiting;
extern char *mrod_user;

void incoming_mesg(int ignore);
void handle_mesg(void);
+8 −0
Original line number Diff line number Diff line
@@ -901,6 +901,14 @@ static int js_push_event(struct mwevent *ev)
		duk_put_prop_string(ctx, idx, "data");
		ret = 0;
		break;
	case MWEV_TYPE_EXIT:
		duk_require_stack(ctx, 2);
		duk_push_string(ctx, "exit");
		duk_put_prop_string(ctx, idx, "type");
		duk_push_string(ctx, ev->ev_data.mrodder);
		duk_put_prop_string(ctx, idx, "data");
		ret = 0;
		break;
	case MWEV_TYPE_NONE:
		/* Fall through */
	default:
+7 −2
Original line number Diff line number Diff line
@@ -855,14 +855,20 @@ void close_down(int logofftype, char *sourceuser, char *reason)
		/* if scripts are available */
		if (cp_test(user, CP_SCRIPT))
		{
			struct mwevent ev = {
				.ev_type = MWEV_TYPE_EXIT,
				.ev_data.mrodder = sourceuser,
			};
			char	*shutdown_name;

			js_handle_event(&ev);
			/* find the shutdown function */
			shutdown_name = NULL;
			if ((shutdown_name = NextLink(shutdown_list, shutdown_name)) != NULL)
			{
				/* if SU, give user who kicked us off if present */
				if (u_god(user)) ExecEvent(shutdown_name, "", "ShutDown", mrod_user, 0);
				if (u_god(user))
					ExecEvent(shutdown_name, "", "ShutDown", sourceuser, 0);
				/* otherwise, no info given */
				else ExecEvent(shutdown_name, "", "ShutDown", NULL, 0);
			}
@@ -881,7 +887,6 @@ void close_down(int logofftype, char *sourceuser, char *reason)
	destroy_colours();
	if (event_user != NULL) free(event_user);
	if (event_body_text != NULL) free(event_body_text);
	if (mrod_user != NULL) free(mrod_user);
	if (saved_rl_text != NULL) free(saved_rl_text);
	colour_free();
	DestroyAllLinks(&bind_list);