about summary refs log tree commit diff
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 bc72e6e5b4..4e6b97734d 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 475fcf063f..b1ccf86f4d 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 1e91bd8198..79f9846ac4 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 0000000000..249512a22e
--- /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 d280c13f1f..c95b98416a 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 a94f5cb861..a85b388482 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 3def97fc83..bf78e0915e 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 1a7c46e9c0..8f3e8faed5 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 22845b64f5..15277573ec 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