version 1.146, 2020/06/01 09:43:00 |
version 1.147, 2020/06/10 07:27:10 |
|
|
CLIENT_EXIT_LOST_SERVER, |
CLIENT_EXIT_LOST_SERVER, |
CLIENT_EXIT_EXITED, |
CLIENT_EXIT_EXITED, |
CLIENT_EXIT_SERVER_EXITED, |
CLIENT_EXIT_SERVER_EXITED, |
|
CLIENT_EXIT_MESSAGE_PROVIDED |
} client_exitreason = CLIENT_EXIT_NONE; |
} client_exitreason = CLIENT_EXIT_NONE; |
static int client_exitflag; |
static int client_exitflag; |
static int client_exitval; |
static int client_exitval; |
static enum msgtype client_exittype; |
static enum msgtype client_exittype; |
static const char *client_exitsession; |
static const char *client_exitsession; |
|
static char *client_exitmessage; |
static const char *client_execshell; |
static const char *client_execshell; |
static const char *client_execcmd; |
static const char *client_execcmd; |
static int client_attached; |
static int client_attached; |
|
|
return ("exited"); |
return ("exited"); |
case CLIENT_EXIT_SERVER_EXITED: |
case CLIENT_EXIT_SERVER_EXITED: |
return ("server exited"); |
return ("server exited"); |
|
case CLIENT_EXIT_MESSAGE_PROVIDED: |
|
return (client_exitmessage); |
} |
} |
return ("unknown reason"); |
return ("unknown reason"); |
} |
} |
|
|
client_dispatch_wait(imsg); |
client_dispatch_wait(imsg); |
} |
} |
|
|
|
/* Process an exit message. */ |
|
static void |
|
client_dispatch_exit_message(char *data, size_t datalen) |
|
{ |
|
int retval; |
|
|
|
if (datalen < sizeof retval && datalen != 0) |
|
fatalx("bad MSG_EXIT size"); |
|
|
|
if (datalen >= sizeof retval) { |
|
memcpy(&retval, data, sizeof retval); |
|
client_exitval = retval; |
|
} |
|
|
|
if (datalen > sizeof retval) { |
|
datalen -= sizeof retval; |
|
data += sizeof retval; |
|
|
|
client_exitmessage = xmalloc(datalen); |
|
memcpy(client_exitmessage, data, datalen); |
|
client_exitmessage[datalen - 1] = '\0'; |
|
|
|
client_exitreason = CLIENT_EXIT_MESSAGE_PROVIDED; |
|
} |
|
} |
|
|
/* Dispatch imsgs when in wait state (before MSG_READY). */ |
/* Dispatch imsgs when in wait state (before MSG_READY). */ |
static void |
static void |
client_dispatch_wait(struct imsg *imsg) |
client_dispatch_wait(struct imsg *imsg) |
{ |
{ |
char *data; |
char *data; |
ssize_t datalen; |
ssize_t datalen; |
int retval; |
|
static int pledge_applied; |
static int pledge_applied; |
|
|
/* |
/* |
|
|
switch (imsg->hdr.type) { |
switch (imsg->hdr.type) { |
case MSG_EXIT: |
case MSG_EXIT: |
case MSG_SHUTDOWN: |
case MSG_SHUTDOWN: |
if (datalen != sizeof retval && datalen != 0) |
client_dispatch_exit_message(data, datalen); |
fatalx("bad MSG_EXIT size"); |
|
if (datalen == sizeof retval) { |
|
memcpy(&retval, data, sizeof retval); |
|
client_exitval = retval; |
|
} |
|
client_exitflag = 1; |
client_exitflag = 1; |
client_exit(); |
client_exit(); |
break; |
break; |
|
|
proc_send(client_peer, MSG_EXITING, -1, NULL, 0); |
proc_send(client_peer, MSG_EXITING, -1, NULL, 0); |
break; |
break; |
case MSG_EXIT: |
case MSG_EXIT: |
if (datalen != 0 && datalen != sizeof (int)) |
client_dispatch_exit_message(data, datalen); |
fatalx("bad MSG_EXIT size"); |
if (client_exitreason == CLIENT_EXIT_NONE) |
|
client_exitreason = CLIENT_EXIT_EXITED; |
proc_send(client_peer, MSG_EXITING, -1, NULL, 0); |
proc_send(client_peer, MSG_EXITING, -1, NULL, 0); |
client_exitreason = CLIENT_EXIT_EXITED; |
|
break; |
break; |
case MSG_EXITED: |
case MSG_EXITED: |
if (datalen != 0) |
if (datalen != 0) |