about summary refs log tree commit diff
path: root/login
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-06-30 07:21:14 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-06-30 08:43:37 +0200
commit734c60ebb607086ad6d67b2544d6b7baba72a652 (patch)
tree3d0480b60b81da20b51df998f6585feeb85a8d14 /login
parent98164ba55d01dfe517a71cbc5538ff1f5dc563d6 (diff)
downloadglibc-734c60ebb607086ad6d67b2544d6b7baba72a652.tar.gz
glibc-734c60ebb607086ad6d67b2544d6b7baba72a652.tar.xz
glibc-734c60ebb607086ad6d67b2544d6b7baba72a652.zip
login: Move libutil into libc
The symbols forkpty, login, login_tty, logout, logwtmp, openpty
were moved using scripts/move-symbol-to-libc.py.

This is a single commit because most of the symbols are tied together
via forkpty, for example.

Several changes to use hidden prototypes are needed.  This commit
also updates pseudoterminal terminology on modified lines.

For 390 (31-bit), this commit follows the existing style for the
compat symbol version creation.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
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