You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
3.5 KiB
155 lines
3.5 KiB
Index: src/Makefile.in |
|
--- src/Makefile.in.orig 2014-01-23 00:27:08.000000000 +0100 |
|
+++ src/Makefile.in 2016-02-28 20:07:40.142551034 +0100 |
|
@@ -483,7 +483,7 @@ |
|
|
|
install-sudosh.conf: |
|
test -z "$(sysconfdir)" || $(mkdir_p) "$(DESTDIR)$(sysconfdir)" |
|
- test -f $(sysconfdir)/sudosh.conf || $(INSTALL) -o 0 -g 0 -m 0444 '$(srcdir)/sudosh.conf' '$(sysconfdir)/sudosh.conf' |
|
+ test -f $(sysconfdir)/sudosh.conf || $(INSTALL) -m 0444 '$(srcdir)/sudosh.conf' '$(sysconfdir)/sudosh.conf' |
|
|
|
install: install-am install-sudosh.conf |
|
|
|
Index: src/getopt.c |
|
--- src/getopt.c.orig 2014-01-23 00:11:58.000000000 +0100 |
|
+++ src/getopt.c 2016-02-28 20:07:40.142551034 +0100 |
|
@@ -37,6 +37,8 @@ |
|
#include "config.h" |
|
#endif |
|
|
|
+#include <string.h> |
|
+ |
|
#ifndef __STDC__ |
|
/* This is a separate conditional since some stdc systems |
|
reject `defined (const)'. */ |
|
Index: src/sudosh.c |
|
--- src/sudosh.c.orig 2014-01-23 00:30:10.000000000 +0100 |
|
+++ src/sudosh.c 2016-02-28 20:07:40.153431816 +0100 |
|
@@ -28,6 +28,13 @@ |
|
|
|
#define WRITE(a, b, c) do_write(a, b, c, __FILE__, __LINE__) |
|
|
|
+#ifdef __FreeBSD__ |
|
+#include <sys/types.h> |
|
+#include <sys/ioctl.h> |
|
+#include <libutil.h> |
|
+#include <sys/param.h> |
|
+#endif |
|
+ |
|
static struct termios termorig; |
|
static struct winsize winorig; |
|
|
|
@@ -529,19 +536,43 @@ |
|
{ |
|
char *sname; |
|
|
|
+#ifdef __FreeBSD__ |
|
+#define PTYLEN 16 |
|
+ char sname_area[PTYLEN]; |
|
+ struct termios tt; |
|
+ struct winsize win; |
|
+ |
|
+ sname = sname_area; |
|
+ if (tcgetattr(STDIN_FILENO, &tt) == -1) |
|
+ { |
|
+ perror ("tcgetattr"); |
|
+ return -1; |
|
+ } |
|
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1) |
|
+ { |
|
+ perror ("ioctl"); |
|
+ return -1; |
|
+ } |
|
+ if (openpty(&p->mfd, &p->sfd, sname, &tt, &win) == -1) { |
|
+#else |
|
if ((p->mfd = open ("/dev/ptmx", O_RDWR)) == -1) |
|
{ |
|
if ((p->mfd = open ("/dev/ptc", O_RDWR)) == -1) |
|
{ |
|
+#endif |
|
perror ("Cannot open cloning master pty"); |
|
return -1; |
|
+#ifndef __FreeBSD__ |
|
} |
|
+#endif |
|
} |
|
|
|
+#if !defined(__FreeBSD_version) || (defined(__FreeBSD_version) && __FreeBSD_version >= 500000) |
|
(void) unlockpt (p->mfd); |
|
(void) grantpt (p->mfd); |
|
|
|
sname = (char *) ptsname (p->mfd); |
|
+#endif |
|
|
|
if ((p->sfd = open (sname, O_RDWR)) == -1) |
|
{ |
|
@@ -601,9 +632,14 @@ |
|
for (i = 3; i < 100; ++i) |
|
close (i); |
|
|
|
+#ifdef __FreeBSD__ |
|
+ (void) tcsetattr(0, TCSADRAIN, &termorig); |
|
+ (void) login_tty(pst->sfd); |
|
+#else |
|
#ifdef TCSETS |
|
(void) ioctl (0, TCSETS, &termorig); |
|
#endif |
|
+#endif |
|
(void) ioctl (0, TIOCSWINSZ, &winorig); |
|
|
|
if (setuid (getuid ())!=0) |
|
@@ -653,6 +689,13 @@ |
|
{ |
|
static struct termios termnew; |
|
|
|
+#ifdef __FreeBSD__ |
|
+ if (tcgetattr(ttyfd, &termorig) == -1) |
|
+ { |
|
+ perror ("tcgetattr failed"); |
|
+ exit (EXIT_FAILURE); |
|
+ } |
|
+#else |
|
#ifdef TCGETS |
|
if (ioctl (ttyfd, TCGETS, &termorig) == -1) |
|
{ |
|
@@ -660,6 +703,7 @@ |
|
exit (EXIT_FAILURE); |
|
} |
|
#endif |
|
+#endif |
|
|
|
if (ioctl (ttyfd, TIOCGWINSZ, &winorig) == -1) |
|
{ |
|
@@ -667,6 +711,11 @@ |
|
exit (EXIT_FAILURE); |
|
} |
|
|
|
+#ifdef __FreeBSD__ |
|
+ (void) cfmakeraw(&termnew); |
|
+ termnew.c_lflag &= ~ECHO; |
|
+ (void) tcsetattr(ttyfd, TCSAFLUSH, &termnew); |
|
+#else |
|
termnew.c_cc[VEOF] = 1; |
|
termnew.c_iflag = BRKINT | ISTRIP | IXON | IXANY; |
|
termnew.c_oflag = 0; |
|
@@ -676,14 +725,20 @@ |
|
#ifdef TCSETS |
|
(void) ioctl (ttyfd, TCSETS, &termnew); |
|
#endif |
|
+#endif |
|
} |
|
|
|
static void |
|
bye (int signum) |
|
{ |
|
+ |
|
+#ifdef __FreeBSD__ |
|
+ (void) tcsetattr(0, TCSADRAIN, &termorig); |
|
+#else |
|
#ifdef TCSETS |
|
(void) ioctl (0, TCSETS, &termorig); |
|
#endif |
|
+#endif |
|
|
|
close (timing.fd); |
|
close (script.fd);
|
|
|