mirror of
https://github.com/tmux/tmux.git
synced 2024-12-13 18:29:00 +00:00
Merge branch 'obsd-master'
This commit is contained in:
commit
487285b325
53
client.c
53
client.c
@ -55,7 +55,7 @@ int client_attached;
|
|||||||
__dead void client_exec(const char *);
|
__dead void client_exec(const char *);
|
||||||
int client_get_lock(char *);
|
int client_get_lock(char *);
|
||||||
int client_connect(struct event_base *, char *, int);
|
int client_connect(struct event_base *, char *, int);
|
||||||
void client_send_identify(void);
|
void client_send_identify(const char *, int);
|
||||||
int client_write_one(enum msgtype, int, const void *, size_t);
|
int client_write_one(enum msgtype, int, const void *, size_t);
|
||||||
int client_write_server(enum msgtype, const void *, size_t);
|
int client_write_server(enum msgtype, const void *, size_t);
|
||||||
void client_update_event(void);
|
void client_update_event(void);
|
||||||
@ -214,7 +214,8 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
|
|||||||
struct cmd *cmd;
|
struct cmd *cmd;
|
||||||
struct cmd_list *cmdlist;
|
struct cmd_list *cmdlist;
|
||||||
struct msg_command_data *data;
|
struct msg_command_data *data;
|
||||||
int cmdflags, fd, i;
|
int cmdflags, fd, i, cwd;
|
||||||
|
const char* ttynam;
|
||||||
pid_t ppid;
|
pid_t ppid;
|
||||||
enum msgtype msg;
|
enum msgtype msg;
|
||||||
char *cause;
|
char *cause;
|
||||||
@ -268,6 +269,26 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
|
|||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Save these before pledge(). */
|
||||||
|
if ((cwd = open(".", O_RDONLY)) == -1)
|
||||||
|
cwd = open("/", O_RDONLY);
|
||||||
|
if ((ttynam = ttyname(STDIN_FILENO)) == NULL)
|
||||||
|
ttynam = "";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drop privileges for client. "proc exec" is needed for -c and for
|
||||||
|
* locking (which uses system(3)).
|
||||||
|
*
|
||||||
|
* "tty" is needed to restore termios(4) and also for some reason -CC
|
||||||
|
* does not work properly without it (input is not recognised).
|
||||||
|
*
|
||||||
|
* "sendfd" is dropped later in client_dispatch_wait().
|
||||||
|
*/
|
||||||
|
if (pledge("stdio unix sendfd proc exec tty", NULL) != 0)
|
||||||
|
fatal("pledge failed");
|
||||||
|
|
||||||
|
/* Free stuff that is not used in the client. */
|
||||||
options_free(&global_options);
|
options_free(&global_options);
|
||||||
options_free(&global_s_options);
|
options_free(&global_s_options);
|
||||||
options_free(&global_w_options);
|
options_free(&global_w_options);
|
||||||
@ -308,7 +329,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send identify messages. */
|
/* Send identify messages. */
|
||||||
client_send_identify();
|
client_send_identify(ttynam, cwd); /* closes cwd */
|
||||||
|
|
||||||
/* Send first command. */
|
/* Send first command. */
|
||||||
if (msg == MSG_COMMAND) {
|
if (msg == MSG_COMMAND) {
|
||||||
@ -363,7 +384,7 @@ client_main(struct event_base *base, int argc, char **argv, int flags)
|
|||||||
|
|
||||||
/* Send identify messages to server. */
|
/* Send identify messages to server. */
|
||||||
void
|
void
|
||||||
client_send_identify(void)
|
client_send_identify(const char *ttynam, int cwd)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
char **ss;
|
char **ss;
|
||||||
@ -377,13 +398,8 @@ client_send_identify(void)
|
|||||||
s = "";
|
s = "";
|
||||||
client_write_one(MSG_IDENTIFY_TERM, -1, s, strlen(s) + 1);
|
client_write_one(MSG_IDENTIFY_TERM, -1, s, strlen(s) + 1);
|
||||||
|
|
||||||
if ((s = ttyname(STDIN_FILENO)) == NULL)
|
client_write_one(MSG_IDENTIFY_TTYNAME, -1, ttynam, strlen(ttynam) + 1);
|
||||||
s = "";
|
client_write_one(MSG_IDENTIFY_CWD, cwd, NULL, 0);
|
||||||
client_write_one(MSG_IDENTIFY_TTYNAME, -1, s, strlen(s) + 1);
|
|
||||||
|
|
||||||
if ((fd = open(".", O_RDONLY)) == -1)
|
|
||||||
fd = open("/", O_RDONLY);
|
|
||||||
client_write_one(MSG_IDENTIFY_CWD, fd, NULL, 0);
|
|
||||||
|
|
||||||
if ((fd = dup(STDIN_FILENO)) == -1)
|
if ((fd = dup(STDIN_FILENO)) == -1)
|
||||||
fatal("dup failed");
|
fatal("dup failed");
|
||||||
@ -399,8 +415,6 @@ client_send_identify(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
client_write_one(MSG_IDENTIFY_DONE, -1, NULL, 0);
|
client_write_one(MSG_IDENTIFY_DONE, -1, NULL, 0);
|
||||||
|
|
||||||
client_update_event();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper to send one message. */
|
/* Helper to send one message. */
|
||||||
@ -591,6 +605,19 @@ client_dispatch_wait(void)
|
|||||||
struct msg_stdout_data stdoutdata;
|
struct msg_stdout_data stdoutdata;
|
||||||
struct msg_stderr_data stderrdata;
|
struct msg_stderr_data stderrdata;
|
||||||
int retval;
|
int retval;
|
||||||
|
static int pledge_applied;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "sendfd" is no longer required once all of the identify messages
|
||||||
|
* have been sent. We know the server won't send us anything until that
|
||||||
|
* point (because we don't ask it to), so we can drop "sendfd" once we
|
||||||
|
* get the first message from the server.
|
||||||
|
*/
|
||||||
|
if (!pledge_applied) {
|
||||||
|
if (pledge("stdio unix proc exec tty", NULL) != 0)
|
||||||
|
fatal("pledge failed");
|
||||||
|
pledge_applied = 1;
|
||||||
|
};
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if ((n = imsg_get(&client_ibuf, &imsg)) == -1)
|
if ((n = imsg_get(&client_ibuf, &imsg)) == -1)
|
||||||
|
Loading…
Reference in New Issue
Block a user