--- posix.c.old 2006-12-06 13:48:21.021525232 +0000 +++ posix.c 2006-12-06 13:52:01.364028080 +0000 @@ -554,6 +554,9 @@ { zval **z_fd; char *p; +#if HAVE_TTYNAME_R + int buflen; +#endif int fd; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &z_fd) == FAILURE) { @@ -571,12 +574,26 @@ fd = Z_LVAL_PP(z_fd); } +#if HAVE_TTYNAME_R + buflen = sysconf(_SC_TTY_NAME_MAX); + p = emalloc(buflen); + + if (ttyname_r(fd, p, buflen) != 0 ) { + POSIX_G(last_error) = errno; + efree(p); + RETURN_FALSE; + } + RETVAL_STRING(p, 1); + efree(p); + return; +#else if (NULL == (p = ttyname(fd))) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_STRING(p, 1); +#endif } /* }}} */ @@ -810,18 +827,40 @@ struct group *g; int name_len; + int ret; +#if HAVE_GETGRNAM_R + struct group gbuf; + int buflen; + char *buf; +#endif + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } +#if HAVE_GETGRNAM_R + buflen = sysconf(_SC_GETGR_R_SIZE_MAX); + buf = emalloc(buflen); + g = &gbuf; + + if (getgrnam_r(name, g, buf, buflen, &g) != 0 || g == NULL) { + POSIX_G(last_error) = errno; + efree(buf); + RETURN_FALSE; + } +#else if (NULL == (g = getgrnam(name))) { POSIX_G(last_error) = errno; RETURN_FALSE; } +#endif array_init(return_value); - - if (!php_posix_group_to_array(g, return_value)) { + ret = php_posix_group_to_array(g, return_value); +#if HAVE_GETGRNAM_R + efree(buf); +#endif + if (0 == ret) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix group to array"); RETURN_FALSE; } @@ -892,23 +931,44 @@ struct passwd *pw; char *name; int name_len; + int ret; + +#ifdef HAVE_GETPWNAM_R + struct passwd pwbuf; + int buflen; + char *buf; +#endif if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } - + +#ifdef HAVE_GETPWNAM_R + buflen = sysconf(_SC_GETPW_R_SIZE_MAX); + buf = emalloc(buflen); + pw = &pwbuf; + + if (getpwnam_r(name, pw, buf, buflen, &pw) != 0 || pw == NULL) { + efree(buf); + POSIX_G(last_error) = errno; + RETURN_FALSE; + } +#else if (NULL == (pw = getpwnam(name))) { POSIX_G(last_error) = errno; RETURN_FALSE; } - - array_init(return_value); +#endif - if (!php_posix_passwd_to_array(pw, return_value)) { + array_init(return_value); + ret = php_posix_passwd_to_array(pw, return_value); +#ifdef HAVE_GETPWNAM_R + efree(buf); +#endif + if (0 == ret) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix passwd struct to array"); RETURN_FALSE; } - } /* }}} */