diff --git a/headers/posix/stdlib.h b/headers/posix/stdlib.h index 51a965f17a..3f85fad381 100644 --- a/headers/posix/stdlib.h +++ b/headers/posix/stdlib.h @@ -183,6 +183,7 @@ extern int getsubopt(char **optionp, char * const *keylistp, extern int posix_openpt(int openFlags); extern int grantpt(int masterFD); extern char* ptsname(int masterFD); +extern int ptsname_r(int masterFD, char *path, size_t maxSize); extern int unlockpt(int masterFD); /* internal accessor to value for MB_CUR_MAX */ diff --git a/src/system/libroot/posix/stdlib/pty.cpp b/src/system/libroot/posix/stdlib/pty.cpp index 78c43bcb99..1522885eb6 100644 --- a/src/system/libroot/posix/stdlib/pty.cpp +++ b/src/system/libroot/posix/stdlib/pty.cpp @@ -5,6 +5,7 @@ #include +#include #include #include @@ -27,19 +28,30 @@ grantpt(int masterFD) } -char* -ptsname(int masterFD) +int +ptsname_r(int masterFD, char* name, size_t namesize) { int32 index; if (ioctl(masterFD, B_IOCTL_GET_TTY_INDEX, &index, sizeof(index)) < 0) - return NULL; + return errno; + + if (name == NULL) + return EINVAL; - static char buffer[32]; - char letter = 'p'; - snprintf(buffer, sizeof(buffer), "/dev/tt/%c%" B_PRIx32, - char(letter + index / 16), index % 16); + int length = snprintf(name, namesize, "/dev/tt/%c%" B_PRIx32, char(letter + index / 16), + index % 16); + return (length + 1) > (int)namesize ? ERANGE : 0; +} + +char* +ptsname(int masterFD) +{ + static char buffer[32]; + errno = ptsname_r(masterFD, buffer, sizeof(buffer)); + if (errno != 0 && errno != ERANGE) + return NULL; return buffer; } @@ -47,6 +59,7 @@ ptsname(int masterFD) int unlockpt(int masterFD) { - // Noting to do ATM. + // Nothing to do ATM. return 0; } +