1
0
mirror of https://github.com/tmux/tmux.git synced 2025-11-24 19:06:07 +00:00
Files
.github
compat
asprintf.c
base64.c
bitstring.h
cfmakeraw.c
clock_gettime.c
closefrom.c
daemon-darwin.c
daemon.c
err.c
explicit_bzero.c
fdforkpty.c
fgetln.c
forkpty-aix.c
forkpty-haiku.c
forkpty-hpux.c
forkpty-sunos.c
freezero.c
getdtablecount.c
getdtablesize.c
getline.c
getopt.c
getprogname.c
imsg-buffer.c
imsg.c
imsg.h
memmem.c
queue.h
reallocarray.c
recallocarray.c
setenv.c
setproctitle.c
strcasestr.c
strlcat.c
strlcpy.c
strndup.c
strnlen.c
strsep.c
strtonum.c
tree.h
unvis.c
utf8proc.c
vis.c
vis.h
fuzz
logo
presentations
regress
tools
.gitignore
.mailmap
.travis.yml
CHANGES
COPYING
Makefile.am
README
README.ja
SYNCING
alerts.c
arguments.c
attributes.c
autogen.sh
cfg.c
client.c
cmd-attach-session.c
cmd-bind-key.c
cmd-break-pane.c
cmd-capture-pane.c
cmd-choose-tree.c
cmd-command-prompt.c
cmd-confirm-before.c
cmd-copy-mode.c
cmd-detach-client.c
cmd-display-menu.c
cmd-display-message.c
cmd-display-panes.c
cmd-find-window.c
cmd-find.c
cmd-if-shell.c
cmd-join-pane.c
cmd-kill-pane.c
cmd-kill-server.c
cmd-kill-session.c
cmd-kill-window.c
cmd-list-buffers.c
cmd-list-clients.c
cmd-list-keys.c
cmd-list-panes.c
cmd-list-sessions.c
cmd-list-windows.c
cmd-load-buffer.c
cmd-lock-server.c
cmd-move-window.c
cmd-new-session.c
cmd-new-window.c
cmd-parse.y
cmd-paste-buffer.c
cmd-pipe-pane.c
cmd-queue.c
cmd-refresh-client.c
cmd-rename-session.c
cmd-rename-window.c
cmd-resize-pane.c
cmd-resize-window.c
cmd-respawn-pane.c
cmd-respawn-window.c
cmd-rotate-window.c
cmd-run-shell.c
cmd-save-buffer.c
cmd-select-layout.c
cmd-select-pane.c
cmd-select-window.c
cmd-send-keys.c
cmd-set-buffer.c
cmd-set-environment.c
cmd-set-option.c
cmd-show-environment.c
cmd-show-messages.c
cmd-show-options.c
cmd-show-prompt-history.c
cmd-source-file.c
cmd-split-window.c
cmd-swap-pane.c
cmd-swap-window.c
cmd-switch-client.c
cmd-unbind-key.c
cmd-wait-for.c
cmd.c
colour.c
compat.h
configure.ac
control-notify.c
control.c
environ.c
example_tmux.conf
file.c
format-draw.c
format.c
grid-reader.c
grid-view.c
grid.c
input-keys.c
input.c
job.c
key-bindings.c
key-string.c
layout-custom.c
layout-set.c
layout.c
log.c
mdoc2man.awk
menu.c
mode-tree.c
names.c
notify.c
options-table.c
options.c
osdep-aix.c
osdep-cygwin.c
osdep-darwin.c
osdep-dragonfly.c
osdep-freebsd.c
osdep-haiku.c
osdep-hpux.c
osdep-linux.c
osdep-netbsd.c
osdep-openbsd.c
osdep-sunos.c
osdep-unknown.c
paste.c
popup.c
proc.c
regsub.c
resize.c
screen-redraw.c
screen-write.c
screen.c
server-client.c
server-fn.c
server.c
session.c
spawn.c
status.c
style.c
tmux-protocol.h
tmux.1
tmux.c
tmux.h
tty-acs.c
tty-features.c
tty-keys.c
tty-term.c
tty.c
utf8.c
window-buffer.c
window-client.c
window-clock.c
window-copy.c
window-customize.c
window-tree.c
window.c
xmalloc.c
xmalloc.h
tmux/compat/forkpty-sunos.c
Nicholas Marriott 640666fb36 Fix some warnings.
2017-03-17 14:55:33 +00:00

93 lines
2.2 KiB
C

/*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdlib.h>
#include <strings.h>
#include <stropts.h>
#include <termios.h>
#include <unistd.h>
#include "compat.h"
void fatal(const char *, ...);
void fatalx(const char *, ...);
pid_t
forkpty(int *master, char *name, struct termios *tio, struct winsize *ws)
{
int slave = -1;
char *path;
pid_t pid;
if ((*master = open("/dev/ptmx", O_RDWR|O_NOCTTY)) == -1)
return (-1);
if (grantpt(*master) != 0)
goto out;
if (unlockpt(*master) != 0)
goto out;
if ((path = ptsname(*master)) == NULL)
goto out;
if (name != NULL)
strlcpy(name, path, TTY_NAME_MAX);
if ((slave = open(path, O_RDWR|O_NOCTTY)) == -1)
goto out;
switch (pid = fork()) {
case -1:
goto out;
case 0:
close(*master);
setsid();
#ifdef TIOCSCTTY
if (ioctl(slave, TIOCSCTTY, NULL) == -1)
fatal("ioctl failed");
#endif
if (ioctl(slave, I_PUSH, "ptem") == -1)
fatal("ioctl failed");
if (ioctl(slave, I_PUSH, "ldterm") == -1)
fatal("ioctl failed");
if (tio != NULL && tcsetattr(slave, TCSAFLUSH, tio) == -1)
fatal("tcsetattr failed");
if (ioctl(slave, TIOCSWINSZ, ws) == -1)
fatal("ioctl failed");
dup2(slave, 0);
dup2(slave, 1);
dup2(slave, 2);
if (slave > 2)
close(slave);
return (0);
}
close(slave);
return (pid);
out:
if (*master != -1)
close(*master);
if (slave != -1)
close(slave);
return (-1);
}