aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-02-10 16:47:05 +0800
committerYuqian Yang <crupest@crupest.life>2025-02-28 17:16:02 +0800
commit5cb97aee88271dfd25c20629052b3d89f05e63c2 (patch)
treea7ce265cba647178cb998930ec968cbba3aae33b
parent42ba662f8b7d39aa29cbc21f6f7ecc69489d142d (diff)
downloadpam-5cb97aee88271dfd25c20629052b3d89f05e63c2.tar.gz
pam-5cb97aee88271dfd25c20629052b3d89f05e63c2.tar.bz2
pam-5cb97aee88271dfd25c20629052b3d89f05e63c2.zip
(GNU/Hurd) port Linux-specific api.
-rw-r--r--examples/tty_conv.c7
-rw-r--r--libpam/pam_modutil_priv.c17
2 files changed, 20 insertions, 4 deletions
diff --git a/examples/tty_conv.c b/examples/tty_conv.c
index 59bbb3b3..0a7af97c 100644
--- a/examples/tty_conv.c
+++ b/examples/tty_conv.c
@@ -8,7 +8,6 @@
#include <unistd.h>
#include <termios.h>
#include <security/pam_appl.h>
-#include <sys/ioctl.h>
/***************************************
* @brief echo off/on
@@ -18,7 +17,7 @@
static void echoOff(int fd, int off)
{
struct termios tty;
- if (ioctl(fd, TCGETA, &tty) < 0)
+ if (tcgetattr(fd, &tty) < 0)
{
fprintf(stderr, "TCGETA failed: %s\n", strerror(errno));
return;
@@ -27,7 +26,7 @@ static void echoOff(int fd, int off)
if (off)
{
tty.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
- if (ioctl(fd, TCSETAF, &tty) < 0)
+ if (tcsetattr(fd, TCSAFLUSH, &tty) < 0)
{
fprintf(stderr, "TCSETAF failed: %s\n", strerror(errno));
}
@@ -35,7 +34,7 @@ static void echoOff(int fd, int off)
else
{
tty.c_lflag |= (ECHO | ECHOE | ECHOK | ECHONL);
- if (ioctl(fd, TCSETAW, &tty) < 0)
+ if (tcsetattr(fd, TCSADRAIN, &tty) < 0)
{
fprintf(stderr, "TCSETAW failed: %s\n", strerror(errno));
}
diff --git a/libpam/pam_modutil_priv.c b/libpam/pam_modutil_priv.c
index a463e06a..cf0ce3ce 100644
--- a/libpam/pam_modutil_priv.c
+++ b/libpam/pam_modutil_priv.c
@@ -14,7 +14,9 @@
#include <syslog.h>
#include <pwd.h>
#include <grp.h>
+#ifdef HAVE_SYS_FSUID_H
#include <sys/fsuid.h>
+#endif /* HAVE_SYS_FSUID_H */
/*
* Two setfsuid() calls in a row are necessary to check
@@ -22,17 +24,32 @@
*/
static int change_uid(uid_t uid, uid_t *save)
{
+#ifdef HAVE_SYS_FSUID_H
uid_t tmp = setfsuid(uid);
if (save)
*save = tmp;
return (uid_t) setfsuid(uid) == uid ? 0 : -1;
+#else
+ uid_t euid = geteuid();
+ if (save)
+ *save = euid;
+ return setresuid(-1, uid, euid);
+#endif
}
+
static int change_gid(gid_t gid, gid_t *save)
{
+#ifdef HAVE_SYS_FSUID_H
gid_t tmp = setfsgid(gid);
if (save)
*save = tmp;
return (gid_t) setfsgid(gid) == gid ? 0 : -1;
+#else
+ uid_t egid = getegid();
+ if (save)
+ *save = egid;
+ return setresgid(-1, gid, egid);
+#endif
}
static int cleanup(struct pam_modutil_privs *p)