aboutsummaryrefslogtreecommitdiff
path: root/login
diff options
context:
space:
mode:
Diffstat (limited to 'login')
-rw-r--r--login/Makefile15
-rw-r--r--login/Versions19
-rw-r--r--login/forkpty.c29
-rw-r--r--login/libutil-compat.c33
-rw-r--r--login/login.c22
-rw-r--r--login/login_tty.c32
-rw-r--r--login/logout.c19
-rw-r--r--login/logwtmp.c12
-rw-r--r--login/openpty.c59
9 files changed, 167 insertions, 73 deletions
diff --git a/login/Makefile b/login/Makefile
index bc72e6e..4e6b977 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -28,7 +28,7 @@ headers := utmp.h bits/utmp.h lastlog.h pty.h
routines := getlogin getlogin_r setlogin getlogin_r_chk \
getutent getutent_r getutid getutline getutid_r getutline_r \
utmp_file utmpname updwtmp getpt grantpt unlockpt ptsname \
- ptsname_r_chk
+ ptsname_r_chk login login_tty logout logwtmp openpty forkpty
CFLAGS-grantpt.c += -DLIBEXECDIR='"$(libexecdir)"'
@@ -46,11 +46,18 @@ vpath %.c programs
tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
tst-pututxline-lockfail tst-pututxline-cache
-# Build the -lutil library with these extra functions.
+ifeq ($(have-GLIBC_2.33),yes)
+# Empty compatibility library for old binaries.
extra-libs := libutil
extra-libs-others := $(extra-libs)
-
-libutil-routines:= login login_tty logout logwtmp openpty forkpty
+libutil-routines := libutil-compat
+libutil-shared-only-routines := libutil-compat
+
+# Pretend that libutil.so is a linker script, so that the symbolic
+# link is not installed.
+install-lib-ldscripts = libutil.so
+$(inst_libdir)/libutil.so:
+endif # $(have-GLIBC_2.33)
include ../Rules
diff --git a/login/Versions b/login/Versions
index 475fcf0..b1ccf86 100644
--- a/login/Versions
+++ b/login/Versions
@@ -16,6 +16,14 @@ libc {
# u*
updwtmp; utmpname;
+
+ # Symbols formerly in libutil.
+ forkpty;
+ login;
+ login_tty;
+ logout;
+ logwtmp;
+ openpty;
}
GLIBC_2.1 {
# e*
@@ -45,10 +53,19 @@ libc {
__getlogin_r_chk;
__ptsname_r_chk;
}
+ GLIBC_2.34 {
+ # Symbols formerly in libutil.
+ forkpty;
+ login;
+ login_tty;
+ logout;
+ logwtmp;
+ openpty;
+ }
}
libutil {
GLIBC_2.0 {
- forkpty; login; login_tty; logout; logwtmp; openpty;
+ __libutil_version_placeholder;
}
}
diff --git a/login/forkpty.c b/login/forkpty.c
index 1e91bd8..79f9846 100644
--- a/login/forkpty.c
+++ b/login/forkpty.c
@@ -21,34 +21,41 @@
#include <unistd.h>
#include <utmp.h>
#include <pty.h>
+#include <shlib-compat.h>
int
-forkpty (int *amaster, char *name, const struct termios *termp,
- const struct winsize *winp)
+__forkpty (int *pptmx, char *name, const struct termios *termp,
+ const struct winsize *winp)
{
- int master, slave, pid;
+ int ptmx, terminal, pid;
- if (openpty (&master, &slave, name, termp, winp) == -1)
+ if (openpty (&ptmx, &terminal, name, termp, winp) == -1)
return -1;
- switch (pid = fork ())
+ switch (pid = __fork ())
{
case -1:
- close (master);
- close (slave);
+ __close (ptmx);
+ __close (terminal);
return -1;
case 0:
/* Child. */
- close (master);
- if (login_tty (slave))
+ __close (ptmx);
+ if (login_tty (terminal))
_exit (1);
return 0;
default:
/* Parent. */
- *amaster = master;
- close (slave);
+ *pptmx = ptmx;
+ __close (terminal);
return pid;
}
}
+versioned_symbol (libc, __forkpty, forkpty, GLIBC_2_34);
+libc_hidden_ver (__forkpty, forkpty)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __forkpty, forkpty, GLIBC_2_0);
+#endif
diff --git a/login/libutil-compat.c b/login/libutil-compat.c
new file mode 100644
index 0000000..249512a
--- /dev/null
+++ b/login/libutil-compat.c
@@ -0,0 +1,33 @@
+/* Placeholder compatibility symbols for libutil.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <shlib-compat.h>
+#include <sys/cdefs.h>
+
+/* This file is used to keep specific symbol versions occupied, so
+ that ld does not generate weak symbol version definitions. */
+
+void
+attribute_compat_text_section
+__attribute_used__
+__libutil_version_placeholder_1 (void)
+{
+}
+
+compat_symbol (libutil, __libutil_version_placeholder_1,
+ __libutil_version_placeholder, GLIBC_2_0);
diff --git a/login/login.c b/login/login.c
index d280c13..c95b984 100644
--- a/login/login.c
+++ b/login/login.c
@@ -23,7 +23,7 @@
#include <unistd.h>
#include <stdlib.h>
#include <utmp.h>
-
+#include <shlib-compat.h>
/* Return the result of ttyname in the buffer pointed to by TTY, which should
be of length BUF_LEN. If it is too long to fit in this buffer, a
@@ -41,7 +41,7 @@ tty_name (int fd, char **tty, size_t buf_len)
if (buf_len)
{
- rv = ttyname_r (fd, buf, buf_len);
+ rv = __ttyname_r (fd, buf, buf_len);
if (rv != 0 || memchr (buf, '\0', buf_len))
/* We either got an error, or we succeeded and the
@@ -78,7 +78,7 @@ tty_name (int fd, char **tty, size_t buf_len)
}
void
-login (const struct utmp *ut)
+__login (const struct utmp *ut)
{
#ifdef PATH_MAX
char _tty[PATH_MAX + UT_LINESIZE];
@@ -114,16 +114,16 @@ login (const struct utmp *ut)
strncpy (copy.ut_line, ttyp, UT_LINESIZE);
/* Tell that we want to use the UTMP file. */
- if (utmpname (_PATH_UTMP) == 0)
+ if (__utmpname (_PATH_UTMP) == 0)
{
/* Open UTMP file. */
- setutent ();
+ __setutent ();
/* Write the entry. */
- pututline (&copy);
+ __pututline (&copy);
/* Close UTMP file. */
- endutent ();
+ __endutent ();
}
if (tty != _tty)
@@ -135,5 +135,11 @@ login (const struct utmp *ut)
strncpy (copy.ut_line, "???", UT_LINESIZE);
/* Update the WTMP file. Here we have to add a new entry. */
- updwtmp (_PATH_WTMP, &copy);
+ __updwtmp (_PATH_WTMP, &copy);
}
+versioned_symbol (libc, __login, login, GLIBC_2_34);
+libc_hidden_ver (__login, login)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __login, login, GLIBC_2_0);
+#endif
diff --git a/login/login_tty.c b/login/login_tty.c
index a94f5cb..a85b388 100644
--- a/login/login_tty.c
+++ b/login/login_tty.c
@@ -37,13 +37,14 @@ static char sccsid[] = "@(#)login_tty.c 8.1 (Berkeley) 6/4/93";
#include <unistd.h>
#include <fcntl.h>
#include <utmp.h>
+#include <shlib-compat.h>
int
-login_tty (int fd)
+__login_tty (int fd)
{
- (void) setsid();
+ __setsid();
#ifdef TIOCSCTTY
- if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1)
+ if (__ioctl(fd, TIOCSCTTY, NULL) == -1)
return (-1);
#else
{
@@ -53,24 +54,29 @@ login_tty (int fd)
if (fdname)
{
if (fd != 0)
- (void) close (0);
+ _close (0);
if (fd != 1)
- (void) close (1);
+ __close (1);
if (fd != 2)
- (void) close (2);
- newfd = open (fdname, O_RDWR);
- (void) close (newfd);
+ __close (2);
+ newfd = __open64 (fdname, O_RDWR);
+ __close (newfd);
}
}
#endif
- while (dup2(fd, 0) == -1 && errno == EBUSY)
+ while (__dup2(fd, 0) == -1 && errno == EBUSY)
;
- while (dup2(fd, 1) == -1 && errno == EBUSY)
+ while (__dup2(fd, 1) == -1 && errno == EBUSY)
;
- while (dup2(fd, 2) == -1 && errno == EBUSY)
+ while (__dup2(fd, 2) == -1 && errno == EBUSY)
;
if (fd > 2)
- (void) close(fd);
+ __close(fd);
return (0);
}
-libutil_hidden_def (login_tty)
+versioned_symbol (libc, __login_tty, login_tty, GLIBC_2_34);
+libc_hidden_ver (__login_tty, login_tty)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __login_tty, login_tty, GLIBC_2_0);
+#endif
diff --git a/login/logout.c b/login/logout.c
index 3def97f..bf78e09 100644
--- a/login/logout.c
+++ b/login/logout.c
@@ -21,27 +21,28 @@
#include <utmp.h>
#include <time.h>
#include <sys/time.h>
+#include <shlib-compat.h>
int
-logout (const char *line)
+__logout (const char *line)
{
struct utmp tmp, utbuf;
struct utmp *ut;
int result = 0;
/* Tell that we want to use the UTMP file. */
- if (utmpname (_PATH_UTMP) == -1)
+ if (__utmpname (_PATH_UTMP) == -1)
return 0;
/* Open UTMP file. */
- setutent ();
+ __setutent ();
/* Fill in search information. */
tmp.ut_type = USER_PROCESS;
strncpy (tmp.ut_line, line, sizeof tmp.ut_line);
/* Read the record. */
- if (getutline_r (&tmp, &utbuf, &ut) >= 0)
+ if (__getutline_r (&tmp, &utbuf, &ut) >= 0)
{
/* Clear information about who & from where. */
memset (ut->ut_name, '\0', sizeof ut->ut_name);
@@ -52,12 +53,18 @@ logout (const char *line)
TIMESPEC_TO_TIMEVAL (&ut->ut_tv, &ts);
ut->ut_type = DEAD_PROCESS;
- if (pututline (ut) != NULL)
+ if (__pututline (ut) != NULL)
result = 1;
}
/* Close UTMP file. */
- endutent ();
+ __endutent ();
return result;
}
+versioned_symbol (libc, __logout, logout, GLIBC_2_34);
+libc_hidden_ver (__logout, logout)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __logout, logout, GLIBC_2_0);
+#endif
diff --git a/login/logwtmp.c b/login/logwtmp.c
index 1a7c46e..8f3e8fa 100644
--- a/login/logwtmp.c
+++ b/login/logwtmp.c
@@ -22,10 +22,10 @@
#include <unistd.h>
#include <utmp.h>
#include <struct___timespec64.h>
-
+#include <shlib-compat.h>
void
-logwtmp (const char *line, const char *name, const char *host)
+__logwtmp (const char *line, const char *name, const char *host)
{
struct utmp ut;
@@ -41,5 +41,11 @@ logwtmp (const char *line, const char *name, const char *host)
__clock_gettime64 (CLOCK_REALTIME, &ts);
TIMESPEC_TO_TIMEVAL (&ut.ut_tv, &ts);
- updwtmp (_PATH_WTMP, &ut);
+ __updwtmp (_PATH_WTMP, &ut);
}
+versioned_symbol (libc, __logwtmp, logwtmp, GLIBC_2_34);
+libc_hidden_ver (__logwtmp, logwtmp)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __logwtmp, logwtmp, GLIBC_2_0);
+#endif
diff --git a/login/openpty.c b/login/openpty.c
index 22845b6..1527757 100644
--- a/login/openpty.c
+++ b/login/openpty.c
@@ -25,7 +25,7 @@
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
-
+#include <shlib-compat.h>
/* Return the result of ptsname_r in the buffer pointed to by PTS,
which should be of length BUF_LEN. If it is too long to fit in
@@ -43,7 +43,7 @@ pts_name (int fd, char **pts, size_t buf_len)
if (buf_len)
{
- rv = ptsname_r (fd, buf, buf_len);
+ rv = __ptsname_r (fd, buf, buf_len);
if (rv != 0 || memchr (buf, '\0', buf_len))
/* We either got an error, or we succeeded and the
@@ -79,12 +79,12 @@ pts_name (int fd, char **pts, size_t buf_len)
return rv;
}
-/* Create pseudo tty master slave pair and set terminal attributes
+/* Create pseudo tty multiplexer/terminal pair and set terminal attributes
according to TERMP and WINP. Return handles for both ends in
- AMASTER and ASLAVE, and return the name of the slave end in NAME. */
+ *PPTMX and *PTERMINAL, and return the name of the terminal end in NAME. */
int
-openpty (int *amaster, int *aslave, char *name,
- const struct termios *termp, const struct winsize *winp)
+__openpty (int *pptmx, int *pterminal, char *name,
+ const struct termios *termp, const struct winsize *winp)
{
#ifdef PATH_MAX
char _buf[PATH_MAX];
@@ -92,51 +92,51 @@ openpty (int *amaster, int *aslave, char *name,
char _buf[512];
#endif
char *buf = _buf;
- int master, ret = -1, slave = -1;
+ int ptmx, ret = -1, terminal = -1;
*buf = '\0';
- master = getpt ();
- if (master == -1)
+ ptmx = __getpt ();
+ if (ptmx == -1)
return -1;
- if (grantpt (master))
+ if (grantpt (ptmx))
goto on_error;
- if (unlockpt (master))
+ if (unlockpt (ptmx))
goto on_error;
#ifdef TIOCGPTPEER
- /* Try to allocate slave fd solely based on master fd first. */
- slave = ioctl (master, TIOCGPTPEER, O_RDWR | O_NOCTTY);
+ /* Try to allocate terminal fd solely based on PTMX fd first. */
+ terminal = __ioctl (ptmx, TIOCGPTPEER, O_RDWR | O_NOCTTY);
#endif
- if (slave == -1)
+ if (terminal == -1)
{
- /* Fallback to path-based slave fd allocation in case kernel doesn't
+ /* Fallback to path-based terminal fd allocation in case kernel doesn't
* support TIOCGPTPEER.
*/
- if (pts_name (master, &buf, sizeof (_buf)))
+ if (pts_name (ptmx, &buf, sizeof (_buf)))
goto on_error;
- slave = open (buf, O_RDWR | O_NOCTTY);
- if (slave == -1)
+ terminal = __open64 (buf, O_RDWR | O_NOCTTY);
+ if (terminal == -1)
goto on_error;
}
/* XXX Should we ignore errors here? */
if (termp)
- tcsetattr (slave, TCSAFLUSH, termp);
+ tcsetattr (terminal, TCSAFLUSH, termp);
#ifdef TIOCSWINSZ
if (winp)
- ioctl (slave, TIOCSWINSZ, winp);
+ __ioctl (terminal, TIOCSWINSZ, winp);
#endif
- *amaster = master;
- *aslave = slave;
+ *pptmx = ptmx;
+ *pterminal = terminal;
if (name != NULL)
{
if (*buf == '\0')
- if (pts_name (master, &buf, sizeof (_buf)))
+ if (pts_name (ptmx, &buf, sizeof (_buf)))
goto on_error;
strcpy (name, buf);
@@ -146,10 +146,10 @@ openpty (int *amaster, int *aslave, char *name,
on_error:
if (ret == -1) {
- close (master);
+ __close (ptmx);
- if (slave != -1)
- close (slave);
+ if (terminal != -1)
+ __close (terminal);
}
if (buf != _buf)
@@ -157,4 +157,9 @@ openpty (int *amaster, int *aslave, char *name,
return ret;
}
-libutil_hidden_def (openpty)
+versioned_symbol (libc, __openpty, openpty, GLIBC_2_34);
+libc_hidden_ver (__openpty, openpty)
+
+#if OTHER_SHLIB_COMPAT (libutil, GLIBC_2_0, GLIBC_2_34)
+compat_symbol (libutil, __openpty, openpty, GLIBC_2_0);
+#endif