1 /* Acquire ownership of the slave side of a pseudo-terminal.
2 Copyright (C) 1998-2002, 2009-2024 Free Software Foundation, Inc.
3 Contributed by Zack Weinberg <zack@rabi.phys.columbia.edu>, 1998.
5 This file is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as
7 published by the Free Software Foundation; either version 2.1 of the
8 License, or (at your option) any later version.
10 This file is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
29 # include <sys/types.h>
30 # include <sys/time.h>
31 # include <sys/resource.h>
34 #include "configmake.h"
35 #include "pty-private.h"
38 # define __set_errno(e) errno = (e)
41 # define __setrlimit setrlimit
42 # define __waitpid waitpid
48 #if defined __OpenBSD__ || defined _WIN32
49 /* On OpenBSD, master and slave of a pseudo-terminal are allocated together,
50 through an ioctl on /dev/ptm. On Windows there are no ptys.
51 Therefore in either case there is no need for grantpt(). */
54 /* This function is most often called from a process without 'root'
55 credentials. Use the helper program. */
57 pid_t pid
= __fork ();
62 /* This is executed in the child process. */
64 # if HAVE_SETRLIMIT && defined RLIMIT_CORE
65 /* Disable core dumps. */
66 struct rlimit rl
= { 0, 0 };
67 __setrlimit (RLIMIT_CORE
, &rl
);
70 /* We pass the master pseudo terminal as file descriptor PTY_FILENO. */
72 if (__dup2 (fd
, PTY_FILENO
) < 0)
79 execle (_PATH_PT_CHOWN
, strrchr (_PATH_PT_CHOWN
, '/') + 1, NULL
, NULL
);
86 if (__waitpid (pid
, &w
, 0) == -1)
89 __set_errno (ENOEXEC
);
91 switch (WEXITSTATUS (w
))
100 __set_errno (EINVAL
);
103 __set_errno (EACCES
);
106 __set_errno (ENOEXEC
);
109 __set_errno (ENOMEM
);
113 assert(! "getpt: internal error: invalid exit code from pt_chown");