projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix swprintf handling of nul character in output
[musl]
/
src
/
misc
/
openpty.c
diff --git
a/src/misc/openpty.c
b/src/misc/openpty.c
index
1020247
..
c107406
100644
(file)
--- a/
src/misc/openpty.c
+++ b/
src/misc/openpty.c
@@
-3,31
+3,38
@@
#include <unistd.h>
#include <pty.h>
#include <stdio.h>
#include <unistd.h>
#include <pty.h>
#include <stdio.h>
+#include <pthread.h>
/* Nonstandard, but vastly superior to the standard functions */
/* Nonstandard, but vastly superior to the standard functions */
-int openpty(int *
m, int *
s, char *name, const struct termios *tio, const struct winsize *ws)
+int openpty(int *
pm, int *p
s, char *name, const struct termios *tio, const struct winsize *ws)
{
{
- int
n=0
;
+ int
m, s, n=0, cs
;
char buf[20];
char buf[20];
-
*
m = open("/dev/ptmx", O_RDWR|O_NOCTTY);
- if (
*
m < 0) return -1;
+ m = open("/dev/ptmx", O_RDWR|O_NOCTTY);
+ if (m < 0) return -1;
- if (ioctl(*m, TIOCSPTLCK, &n) || ioctl (*m, TIOCGPTN, &n)) {
- close(*m);
- return -1;
- }
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+ if (ioctl(m, TIOCSPTLCK, &n) || ioctl (m, TIOCGPTN, &n))
+ goto fail;
if (!name) name = buf;
snprintf(name, sizeof buf, "/dev/pts/%d", n);
if (!name) name = buf;
snprintf(name, sizeof buf, "/dev/pts/%d", n);
- if ((*s = open(name, O_RDWR|O_NOCTTY)) < 0) {
- close(*m);
- return -1;
- }
+ if ((s = open(name, O_RDWR|O_NOCTTY)) < 0)
+ goto fail;
+
+ if (tio) tcsetattr(s, TCSANOW, tio);
+ if (ws) ioctl(s, TIOCSWINSZ, ws);
-
if (tio) tcsetattr(*s, TCSANOW, tio)
;
-
if (ws) ioctl(*s, TIOCSWINSZ, ws)
;
+
*pm = m
;
+
*ps = s
;
+ pthread_setcancelstate(cs, 0);
return 0;
return 0;
+fail:
+ close(m);
+ pthread_setcancelstate(cs, 0);
+ return -1;
}
}