php-src/ext/posix/posix.c

1381 lines
31 KiB
C
Raw Normal View History

1999-12-03 13:13:48 +00:00
/*
+----------------------------------------------------------------------+
2004-01-08 08:18:22 +00:00
| PHP Version 5 |
1999-12-03 13:13:48 +00:00
+----------------------------------------------------------------------+
2014-01-03 03:08:10 +00:00
| Copyright (c) 1997-2014 The PHP Group |
1999-12-03 13:13:48 +00:00
+----------------------------------------------------------------------+
2006-01-01 12:51:34 +00:00
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
2006-01-01 12:51:34 +00:00
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
1999-12-03 13:13:48 +00:00
+----------------------------------------------------------------------+
2002-02-28 08:29:35 +00:00
| Author: Kristian Koehntopp <kris@koehntopp.de> |
1999-12-03 13:13:48 +00:00
+----------------------------------------------------------------------+
*/
1999-12-03 13:13:48 +00:00
/* $Id$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
1999-12-03 13:13:48 +00:00
#include "php.h"
#include <unistd.h>
2000-04-05 21:43:03 +00:00
#include "ext/standard/info.h"
2001-08-08 02:02:02 +00:00
#include "ext/standard/php_string.h"
#include "php_posix.h"
1999-12-03 13:13:48 +00:00
1999-12-03 13:13:48 +00:00
#if HAVE_POSIX
2001-08-08 02:02:02 +00:00
1999-12-03 13:13:48 +00:00
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
2001-08-08 02:02:02 +00:00
1999-12-03 13:13:48 +00:00
#include <sys/resource.h>
#if defined(_GNU_SOURCE) && !defined(__USE_GNU)
# define __USE_GNU
#endif
1999-12-03 13:13:48 +00:00
#include <sys/utsname.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/times.h>
#include <errno.h>
#include <grp.h>
#include <pwd.h>
2005-06-06 22:04:14 +00:00
#if HAVE_SYS_MKDEV_H
# include <sys/mkdev.h>
#endif
1999-12-03 13:13:48 +00:00
ZEND_DECLARE_MODULE_GLOBALS(posix)
static PHP_MINFO_FUNCTION(posix);
1999-12-03 13:13:48 +00:00
2008-06-23 16:41:00 +00:00
/* {{{ arginfo */
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_kill, 0, 0, 2)
ZEND_ARG_INFO(0, pid)
ZEND_ARG_INFO(0, sig)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_getpid, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_getppid, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_getuid, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setuid, 0, 0, 1)
ZEND_ARG_INFO(0, uid)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_geteuid, 0)
ZEND_END_ARG_INFO()
#ifdef HAVE_SETEUID
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_seteuid, 0, 0, 1)
ZEND_ARG_INFO(0, uid)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO(arginfo_posix_getgid, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setgid, 0, 0, 1)
ZEND_ARG_INFO(0, gid)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_getegid, 0)
ZEND_END_ARG_INFO()
#ifdef HAVE_SETEGID
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setegid, 0, 0, 1)
ZEND_ARG_INFO(0, gid)
ZEND_END_ARG_INFO()
#endif
#ifdef HAVE_GETGROUPS
ZEND_BEGIN_ARG_INFO(arginfo_posix_getgroups, 0)
ZEND_END_ARG_INFO()
#endif
#ifdef HAVE_GETLOGIN
ZEND_BEGIN_ARG_INFO(arginfo_posix_getlogin, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO(arginfo_posix_getpgrp, 0)
ZEND_END_ARG_INFO()
#ifdef HAVE_SETSID
ZEND_BEGIN_ARG_INFO(arginfo_posix_setsid, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_setpgid, 0, 0, 2)
ZEND_ARG_INFO(0, pid)
ZEND_ARG_INFO(0, pgid)
ZEND_END_ARG_INFO()
#ifdef HAVE_GETPGID
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getpgid, 0, 0, 1)
ZEND_ARG_INFO(0, pid)
ZEND_END_ARG_INFO()
#endif
#ifdef HAVE_GETSID
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getsid, 0, 0, 1)
ZEND_ARG_INFO(0, pid)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO(arginfo_posix_uname, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_times, 0)
ZEND_END_ARG_INFO()
#ifdef HAVE_CTERMID
ZEND_BEGIN_ARG_INFO(arginfo_posix_ctermid, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_ttyname, 0, 0, 1)
ZEND_ARG_INFO(0, fd)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_isatty, 0, 0, 1)
ZEND_ARG_INFO(0, fd)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_posix_getcwd, 0)
ZEND_END_ARG_INFO()
#ifdef HAVE_MKFIFO
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_mkfifo, 0, 0, 2)
ZEND_ARG_INFO(0, pathname)
ZEND_ARG_INFO(0, mode)
ZEND_END_ARG_INFO()
#endif
#ifdef HAVE_MKNOD
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_mknod, 0, 0, 2)
ZEND_ARG_INFO(0, pathname)
ZEND_ARG_INFO(0, mode)
ZEND_ARG_INFO(0, major)
ZEND_ARG_INFO(0, minor)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_access, 0, 0, 1)
ZEND_ARG_INFO(0, file)
ZEND_ARG_INFO(0, mode)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getgrnam, 0, 0, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getgrgid, 0, 0, 1)
ZEND_ARG_INFO(0, gid)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getpwnam, 0, 0, 1)
ZEND_ARG_INFO(0, username)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_getpwuid, 0, 0, 1)
ZEND_ARG_INFO(0, uid)
ZEND_END_ARG_INFO()
#ifdef HAVE_GETRLIMIT
ZEND_BEGIN_ARG_INFO(arginfo_posix_getrlimit, 0)
ZEND_END_ARG_INFO()
#endif
ZEND_BEGIN_ARG_INFO(arginfo_posix_get_last_error, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_strerror, 0, 0, 1)
ZEND_ARG_INFO(0, errno)
ZEND_END_ARG_INFO()
#ifdef HAVE_INITGROUPS
ZEND_BEGIN_ARG_INFO_EX(arginfo_posix_initgroups, 0, 0, 2)
ZEND_ARG_INFO(0, name)
ZEND_ARG_INFO(0, base_group_id)
ZEND_END_ARG_INFO()
#endif
2008-06-23 17:28:06 +00:00
/* }}} */
2008-06-23 16:41:00 +00:00
/* {{{ posix_functions[]
*/
const zend_function_entry posix_functions[] = {
1999-12-03 13:13:48 +00:00
/* POSIX.1, 3.3 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_kill, arginfo_posix_kill)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.1 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getpid, arginfo_posix_getpid)
PHP_FE(posix_getppid, arginfo_posix_getppid)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.2 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getuid, arginfo_posix_getuid)
PHP_FE(posix_setuid, arginfo_posix_setuid)
PHP_FE(posix_geteuid, arginfo_posix_geteuid)
#ifdef HAVE_SETEUID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_seteuid, arginfo_posix_seteuid)
#endif
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getgid, arginfo_posix_getgid)
PHP_FE(posix_setgid, arginfo_posix_setgid)
PHP_FE(posix_getegid, arginfo_posix_getegid)
2002-04-10 06:22:12 +00:00
#ifdef HAVE_SETEGID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_setegid, arginfo_posix_setegid)
2002-04-10 06:22:12 +00:00
#endif
#ifdef HAVE_GETGROUPS
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getgroups, arginfo_posix_getgroups)
#endif
#ifdef HAVE_GETLOGIN
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getlogin, arginfo_posix_getlogin)
#endif
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.3 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getpgrp, arginfo_posix_getpgrp)
#ifdef HAVE_SETSID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_setsid, arginfo_posix_setsid)
#endif
2008-06-23 16:41:00 +00:00
PHP_FE(posix_setpgid, arginfo_posix_setpgid)
1999-12-03 13:13:48 +00:00
/* Non-Posix functions which are common */
#ifdef HAVE_GETPGID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getpgid, arginfo_posix_getpgid)
#endif /* HAVE_GETPGID */
#ifdef HAVE_GETSID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getsid, arginfo_posix_getsid)
#endif /* HAVE_GETSID */
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.4 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_uname, arginfo_posix_uname)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.5 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_times, arginfo_posix_times)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 4.7 */
#ifdef HAVE_CTERMID
2008-06-23 16:41:00 +00:00
PHP_FE(posix_ctermid, arginfo_posix_ctermid)
#endif
2008-06-23 16:41:00 +00:00
PHP_FE(posix_ttyname, arginfo_posix_ttyname)
PHP_FE(posix_isatty, arginfo_posix_isatty)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 5.2 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getcwd, arginfo_posix_getcwd)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 5.4 */
#ifdef HAVE_MKFIFO
2008-06-23 16:41:00 +00:00
PHP_FE(posix_mkfifo, arginfo_posix_mkfifo)
#endif
2005-05-13 21:38:17 +00:00
#ifdef HAVE_MKNOD
2008-06-23 16:41:00 +00:00
PHP_FE(posix_mknod, arginfo_posix_mknod)
2005-05-13 21:38:17 +00:00
#endif
1999-12-03 13:13:48 +00:00
/* POSIX.1, 5.6 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_access, arginfo_posix_access)
1999-12-03 13:13:48 +00:00
/* POSIX.1, 9.2 */
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getgrnam, arginfo_posix_getgrnam)
PHP_FE(posix_getgrgid, arginfo_posix_getgrgid)
PHP_FE(posix_getpwnam, arginfo_posix_getpwnam)
PHP_FE(posix_getpwuid, arginfo_posix_getpwuid)
1999-12-03 13:13:48 +00:00
#ifdef HAVE_GETRLIMIT
2008-06-23 16:41:00 +00:00
PHP_FE(posix_getrlimit, arginfo_posix_getrlimit)
#endif
2008-06-23 16:41:00 +00:00
PHP_FE(posix_get_last_error, arginfo_posix_get_last_error)
PHP_FALIAS(posix_errno, posix_get_last_error, arginfo_posix_get_last_error)
2008-06-23 16:41:00 +00:00
PHP_FE(posix_strerror, arginfo_posix_strerror)
2006-06-19 02:19:13 +00:00
#ifdef HAVE_INITGROUPS
2008-06-23 16:41:00 +00:00
PHP_FE(posix_initgroups, arginfo_posix_initgroups)
2006-06-19 02:19:13 +00:00
#endif
1999-12-03 13:13:48 +00:00
2011-07-25 11:35:02 +00:00
PHP_FE_END
1999-12-03 13:13:48 +00:00
};
/* }}} */
1999-12-03 13:13:48 +00:00
/* {{{ PHP_MINFO_FUNCTION
*/
static PHP_MINFO_FUNCTION(posix)
{
php_info_print_table_start();
php_info_print_table_row(2, "Revision", "$Id$");
php_info_print_table_end();
}
/* }}} */
2008-05-04 09:34:16 +00:00
static PHP_GINIT_FUNCTION(posix) /* {{{ */
{
posix_globals->last_error = 0;
}
2008-05-04 09:34:16 +00:00
/* }}} */
/* {{{ PHP_MINIT_FUNCTION(posix)
*/
static PHP_MINIT_FUNCTION(posix)
{
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_F_OK", F_OK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("POSIX_X_OK", X_OK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("POSIX_W_OK", W_OK, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("POSIX_R_OK", R_OK, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#ifdef S_IFREG
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_S_IFREG", S_IFREG, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#endif
#ifdef S_IFCHR
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_S_IFCHR", S_IFCHR, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#endif
#ifdef S_IFBLK
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_S_IFBLK", S_IFBLK, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#endif
#ifdef S_IFIFO
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_S_IFIFO", S_IFIFO, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#endif
#ifdef S_IFSOCK
2014-08-25 17:24:55 +00:00
REGISTER_LONG_CONSTANT("POSIX_S_IFSOCK", S_IFSOCK, CONST_CS | CONST_PERSISTENT);
2005-05-13 21:38:17 +00:00
#endif
return SUCCESS;
}
/* }}} */
/* {{{ posix_module_entry
*/
zend_module_entry posix_module_entry = {
STANDARD_MODULE_HEADER,
"posix",
1999-12-03 13:13:48 +00:00
posix_functions,
PHP_MINIT(posix),
1999-12-03 13:13:48 +00:00
NULL,
NULL,
NULL,
PHP_MINFO(posix),
NO_VERSION_YET,
PHP_MODULE_GLOBALS(posix),
PHP_GINIT(posix),
NULL,
NULL,
STANDARD_MODULE_PROPERTIES_EX
1999-12-03 13:13:48 +00:00
};
/* }}} */
1999-12-03 13:13:48 +00:00
2000-05-23 09:33:51 +00:00
#ifdef COMPILE_DL_POSIX
ZEND_GET_MODULE(posix)
1999-12-03 13:13:48 +00:00
#endif
2008-03-10 22:15:36 +00:00
#define PHP_POSIX_NO_ARGS if (zend_parse_parameters_none() == FAILURE) return;
2004-04-18 21:49:10 +00:00
2014-08-25 17:24:55 +00:00
#define PHP_POSIX_RETURN_LONG_FUNC(func_name) \
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS \
2014-08-25 17:24:55 +00:00
RETURN_LONG(func_name());
2004-04-18 21:49:10 +00:00
#define PHP_POSIX_SINGLE_ARG_FUNC(func_name) \
2014-08-25 17:24:55 +00:00
zend_long val; \
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &val) == FAILURE) RETURN_FALSE; \
2004-04-18 21:49:10 +00:00
if (func_name(val) < 0) { \
POSIX_G(last_error) = errno; \
RETURN_FALSE; \
} \
RETURN_TRUE;
/* {{{ proto bool posix_kill(int pid, int sig)
1999-12-03 13:13:48 +00:00
Send a signal to a process (POSIX.1, 3.3.2) */
PHP_FUNCTION(posix_kill)
{
2014-08-25 17:24:55 +00:00
zend_long pid, sig;
1999-12-03 13:13:48 +00:00
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &pid, &sig) == FAILURE) {
RETURN_FALSE;
}
if (kill(pid, sig) < 0) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/* {{{ proto int posix_getpid(void)
1999-12-03 13:13:48 +00:00
Get the current process id (POSIX.1, 4.1.1) */
PHP_FUNCTION(posix_getpid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getpid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_getppid(void)
1999-12-03 13:13:48 +00:00
Get the parent process id (POSIX.1, 4.1.1) */
PHP_FUNCTION(posix_getppid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getppid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_getuid(void)
1999-12-03 13:13:48 +00:00
Get the current user id (POSIX.1, 4.2.1) */
PHP_FUNCTION(posix_getuid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getuid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_getgid(void)
1999-12-03 13:13:48 +00:00
Get the current group id (POSIX.1, 4.2.1) */
PHP_FUNCTION(posix_getgid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getgid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_geteuid(void)
1999-12-03 13:13:48 +00:00
Get the current effective user id (POSIX.1, 4.2.1) */
PHP_FUNCTION(posix_geteuid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(geteuid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_getegid(void)
1999-12-03 13:13:48 +00:00
Get the current effective group id (POSIX.1, 4.2.1) */
PHP_FUNCTION(posix_getegid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getegid);
2004-04-18 21:49:10 +00:00
}
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto bool posix_setuid(long uid)
1999-12-03 13:13:48 +00:00
Set user id (POSIX.1, 4.2.2) */
PHP_FUNCTION(posix_setuid)
{
2004-04-18 21:49:10 +00:00
PHP_POSIX_SINGLE_ARG_FUNC(setuid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto bool posix_setgid(int uid)
1999-12-03 13:13:48 +00:00
Set group id (POSIX.1, 4.2.2) */
PHP_FUNCTION(posix_setgid)
{
2004-04-18 21:49:10 +00:00
PHP_POSIX_SINGLE_ARG_FUNC(setgid);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto bool posix_seteuid(long uid)
Set effective user id */
#ifdef HAVE_SETEUID
PHP_FUNCTION(posix_seteuid)
{
2004-04-18 21:49:10 +00:00
PHP_POSIX_SINGLE_ARG_FUNC(seteuid);
}
#endif
/* }}} */
/* {{{ proto bool posix_setegid(long uid)
Set effective group id */
#ifdef HAVE_SETEGID
PHP_FUNCTION(posix_setegid)
{
2004-04-18 21:49:10 +00:00
PHP_POSIX_SINGLE_ARG_FUNC(setegid);
}
#endif
/* }}} */
/* {{{ proto array posix_getgroups(void)
1999-12-03 13:13:48 +00:00
Get supplementary group id's (POSIX.1, 4.2.3) */
#ifdef HAVE_GETGROUPS
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_getgroups)
{
gid_t gidlist[NGROUPS_MAX];
int result;
int i;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
if ((result = getgroups(NGROUPS_MAX, gidlist)) < 0) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
array_init(return_value);
1999-12-03 13:13:48 +00:00
for (i=0; i<result; i++) {
2014-08-25 17:24:55 +00:00
add_next_index_long(return_value, gidlist[i]);
1999-12-03 13:13:48 +00:00
}
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto string posix_getlogin(void)
Get user name (POSIX.1, 4.2.4) */
#ifdef HAVE_GETLOGIN
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_getlogin)
{
char *p;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
if (NULL == (p = getlogin())) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
2014-05-06 10:50:54 +00:00
RETURN_STRING(p);
1999-12-03 13:13:48 +00:00
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto int posix_getpgrp(void)
1999-12-03 13:13:48 +00:00
Get current process group id (POSIX.1, 4.3.1) */
PHP_FUNCTION(posix_getpgrp)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(getpgrp);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_setsid(void)
1999-12-03 13:13:48 +00:00
Create session and set process group id (POSIX.1, 4.3.2) */
#ifdef HAVE_SETSID
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_setsid)
{
2014-08-25 17:24:55 +00:00
PHP_POSIX_RETURN_LONG_FUNC(setsid);
1999-12-03 13:13:48 +00:00
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto bool posix_setpgid(int pid, int pgid)
1999-12-03 13:13:48 +00:00
Set process group id for job control (POSIX.1, 4.3.3) */
PHP_FUNCTION(posix_setpgid)
{
2014-08-25 17:24:55 +00:00
zend_long pid, pgid;
1999-12-03 13:13:48 +00:00
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &pid, &pgid) == FAILURE) {
RETURN_FALSE;
}
if (setpgid(pid, pgid) < 0) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
RETURN_TRUE;
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto int posix_getpgid(void)
1999-12-03 13:13:48 +00:00
Get the process group id of the specified process (This is not a POSIX function, but a SVR4ism, so we compile conditionally) */
#ifdef HAVE_GETPGID
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_getpgid)
{
2014-08-25 17:24:55 +00:00
zend_long val;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &val) == FAILURE) {
RETURN_FALSE;
}
if ((val = getpgid(val)) < 0) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
2014-08-25 17:24:55 +00:00
RETURN_LONG(val);
1999-12-03 13:13:48 +00:00
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto int posix_getsid(void)
1999-12-03 13:13:48 +00:00
Get process group id of session leader (This is not a POSIX function, but a SVR4ism, so be compile conditionally) */
#ifdef HAVE_GETSID
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_getsid)
{
2014-08-25 17:24:55 +00:00
zend_long val;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &val) == FAILURE) {
RETURN_FALSE;
}
if ((val = getsid(val)) < 0) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
2014-08-25 17:24:55 +00:00
RETURN_LONG(val);
1999-12-03 13:13:48 +00:00
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* {{{ proto array posix_uname(void)
1999-12-03 13:13:48 +00:00
Get system name (POSIX.1, 4.4.1) */
PHP_FUNCTION(posix_uname)
{
struct utsname u;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
if (uname(&u) < 0) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
array_init(return_value);
2014-04-15 11:40:40 +00:00
add_assoc_string(return_value, "sysname", u.sysname);
add_assoc_string(return_value, "nodename", u.nodename);
add_assoc_string(return_value, "release", u.release);
add_assoc_string(return_value, "version", u.version);
add_assoc_string(return_value, "machine", u.machine);
#if defined(_GNU_SOURCE) && !defined(DARWIN) && defined(HAVE_UTSNAME_DOMAINNAME)
2014-04-15 11:40:40 +00:00
add_assoc_string(return_value, "domainname", u.domainname);
#endif
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* POSIX.1, 4.5.1 time() - Get System Time
already covered by PHP
1999-12-03 13:13:48 +00:00
*/
/* {{{ proto array posix_times(void)
1999-12-03 13:13:48 +00:00
Get process times (POSIX.1, 4.5.2) */
PHP_FUNCTION(posix_times)
{
struct tms t;
clock_t ticks;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
if ((ticks = times(&t)) == -1) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
1999-12-03 13:13:48 +00:00
}
array_init(return_value);
2014-08-25 17:24:55 +00:00
add_assoc_long(return_value, "ticks", ticks); /* clock ticks */
add_assoc_long(return_value, "utime", t.tms_utime); /* user time */
add_assoc_long(return_value, "stime", t.tms_stime); /* system time */
add_assoc_long(return_value, "cutime", t.tms_cutime); /* user time of children */
add_assoc_long(return_value, "cstime", t.tms_cstime); /* system time of children */
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* POSIX.1, 4.6.1 getenv() - Environment Access
already covered by PHP
1999-12-03 13:13:48 +00:00
*/
/* {{{ proto string posix_ctermid(void)
1999-12-03 13:13:48 +00:00
Generate terminal path name (POSIX.1, 4.7.1) */
#ifdef HAVE_CTERMID
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_ctermid)
{
char buffer[L_ctermid];
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
2002-05-04 16:54:13 +00:00
if (NULL == ctermid(buffer)) {
2002-04-13 00:31:55 +00:00
/* Found no documentation how the defined behaviour is when this
* function fails
*/
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
2014-05-06 10:50:54 +00:00
RETURN_STRING(buffer);
1999-12-03 13:13:48 +00:00
}
#endif
1999-12-03 13:13:48 +00:00
/* }}} */
/* Checks if the provides resource is a stream and if it provides a file descriptor */
2008-05-04 09:34:16 +00:00
static int php_posix_stream_get_fd(zval *zfp, int *fd TSRMLS_DC) /* {{{ */
{
php_stream *stream;
2014-05-06 10:50:54 +00:00
php_stream_from_zval_no_verify(stream, zfp);
if (stream == NULL) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "expects argument 1 to be a valid stream resource");
return 0;
}
if (php_stream_can_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT) == SUCCESS) {
php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT, (void*)fd, 0);
} else if (php_stream_can_cast(stream, PHP_STREAM_AS_FD) == SUCCESS) {
php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)fd, 0);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not use stream of type '%s'",
stream->ops->label);
return 0;
}
return 1;
}
2008-05-04 09:34:16 +00:00
/* }}} */
/* {{{ proto string posix_ttyname(int fd)
1999-12-03 13:13:48 +00:00
Determine terminal device name (POSIX.1, 4.7.2) */
PHP_FUNCTION(posix_ttyname)
{
2014-05-06 10:50:54 +00:00
zval *z_fd;
1999-12-03 13:13:48 +00:00
char *p;
int fd;
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
2014-08-25 17:24:55 +00:00
zend_long buflen;
#endif
1999-12-03 13:13:48 +00:00
2014-05-06 10:50:54 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_fd) == FAILURE) {
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
2014-05-06 10:50:54 +00:00
switch (Z_TYPE_P(z_fd)) {
case IS_RESOURCE:
2014-05-06 10:50:54 +00:00
if (!php_posix_stream_get_fd(z_fd, &fd TSRMLS_CC)) {
RETURN_FALSE;
}
break;
default:
2014-08-25 19:51:49 +00:00
convert_to_long_ex(z_fd);
2014-08-25 17:24:55 +00:00
fd = Z_LVAL_P(z_fd);
}
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
buflen = sysconf(_SC_TTY_NAME_MAX);
if (buflen < 1) {
RETURN_FALSE;
}
p = emalloc(buflen);
if (ttyname_r(fd, p, buflen)) {
POSIX_G(last_error) = errno;
efree(p);
RETURN_FALSE;
}
2014-07-22 13:14:43 +00:00
RETURN_STRING(p);
efree(p);
#else
if (NULL == (p = ttyname(fd))) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
#endif
2014-05-06 10:50:54 +00:00
RETURN_STRING(p);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto bool posix_isatty(int fd)
1999-12-03 13:13:48 +00:00
Determine if filedesc is a tty (POSIX.1, 4.7.1) */
PHP_FUNCTION(posix_isatty)
{
2014-05-06 10:50:54 +00:00
zval *z_fd;
int fd;
1999-12-03 13:13:48 +00:00
2014-05-06 10:50:54 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_fd) == FAILURE) {
RETURN_FALSE;
}
2014-05-06 10:50:54 +00:00
switch (Z_TYPE_P(z_fd)) {
case IS_RESOURCE:
2014-05-06 10:50:54 +00:00
if (!php_posix_stream_get_fd(z_fd, &fd TSRMLS_CC)) {
RETURN_FALSE;
}
break;
default:
2014-08-25 19:51:49 +00:00
convert_to_long_ex(z_fd);
2014-08-25 17:24:55 +00:00
fd = Z_LVAL_P(z_fd);
}
if (isatty(fd)) {
RETURN_TRUE;
} else {
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
}
/* }}} */
/*
POSIX.1, 4.8.1 sysconf() - TODO
POSIX.1, 5.7.1 pathconf(), fpathconf() - TODO
POSIX.1, 5.1.2 opendir(), readdir(), rewinddir(), closedir()
POSIX.1, 5.2.1 chdir()
already supported by PHP
*/
/* {{{ proto string posix_getcwd(void)
1999-12-03 13:13:48 +00:00
Get working directory pathname (POSIX.1, 5.2.2) */
PHP_FUNCTION(posix_getcwd)
{
char buffer[MAXPATHLEN];
char *p;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
p = VCWD_GETCWD(buffer, MAXPATHLEN);
1999-12-03 13:13:48 +00:00
if (!p) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
2014-05-06 10:50:54 +00:00
RETURN_STRING(buffer);
1999-12-03 13:13:48 +00:00
}
/* }}} */
/*
POSIX.1, 5.3.x open(), creat(), umask()
POSIX.1, 5.4.1 link()
already supported by PHP.
*/
2002-04-23 22:22:17 +00:00
/* {{{ proto bool posix_mkfifo(string pathname, int mode)
1999-12-03 13:13:48 +00:00
Make a FIFO special file (POSIX.1, 5.4.2) */
#ifdef HAVE_MKFIFO
1999-12-03 13:13:48 +00:00
PHP_FUNCTION(posix_mkfifo)
{
char *path;
int path_len;
2014-08-25 17:24:55 +00:00
zend_long mode;
1999-12-03 13:13:48 +00:00
int result;
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "pl", &path, &path_len, &mode) == FAILURE) {
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
if (php_check_open_basedir_ex(path, 0 TSRMLS_CC)) {
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
result = mkfifo(path, mode);
1999-12-03 13:13:48 +00:00
if (result < 0) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
RETURN_TRUE;
}
1999-12-03 13:13:48 +00:00
#endif
/* }}} */
1999-12-03 13:13:48 +00:00
2005-05-13 21:38:17 +00:00
/* {{{ proto bool posix_mknod(string pathname, int mode [, int major [, int minor]])
Make a special or ordinary file (POSIX.1) */
#ifdef HAVE_MKNOD
PHP_FUNCTION(posix_mknod)
{
char *path;
int path_len;
2014-08-25 17:24:55 +00:00
zend_long mode;
zend_long major = 0, minor = 0;
2005-05-13 21:38:17 +00:00
int result;
dev_t php_dev;
php_dev = 0;
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "pl|ll", &path, &path_len,
2005-05-13 21:38:17 +00:00
&mode, &major, &minor) == FAILURE) {
RETURN_FALSE;
}
if (php_check_open_basedir_ex(path, 0 TSRMLS_CC)) {
2005-05-13 21:38:17 +00:00
RETURN_FALSE;
}
if ((mode & S_IFCHR) || (mode & S_IFBLK)) {
if (ZEND_NUM_ARGS() == 2) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "For S_IFCHR and S_IFBLK you need to pass a major device kernel identifier");
RETURN_FALSE;
}
2005-05-13 21:38:17 +00:00
if (major == 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Expects argument 3 to be non-zero for POSIX_S_IFCHR and POSIX_S_IFBLK");
2005-05-13 21:38:17 +00:00
RETURN_FALSE;
} else {
2005-08-08 21:44:58 +00:00
#if defined(HAVE_MAKEDEV) || defined(makedev)
2005-05-13 21:38:17 +00:00
php_dev = makedev(major, minor);
#else
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot create a block or character device, creating a normal file instead");
#endif
2005-05-13 21:38:17 +00:00
}
}
result = mknod(path, mode, php_dev);
if (result < 0) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
RETURN_TRUE;
}
#endif
/* }}} */
/* Takes a pointer to posix group and a pointer to an already initialized ZVAL
* array container and fills the array with the posix group member data. */
2008-05-04 09:34:16 +00:00
int php_posix_group_to_array(struct group *g, zval *array_group) /* {{{ */
{
2014-05-06 10:50:54 +00:00
zval array_members;
int count;
if (NULL == g)
return 0;
if (array_group == NULL || Z_TYPE_P(array_group) != IS_ARRAY)
return 0;
2014-05-06 10:50:54 +00:00
array_init(&array_members);
2014-04-15 11:40:40 +00:00
add_assoc_string(array_group, "name", g->gr_name);
add_assoc_string(array_group, "passwd", g->gr_passwd);
for (count=0; g->gr_mem[count] != NULL; count++) {
2014-05-06 10:50:54 +00:00
add_next_index_string(&array_members, g->gr_mem[count]);
}
2014-05-06 10:50:54 +00:00
zend_hash_str_update(Z_ARRVAL_P(array_group), "members", sizeof("members")-1, &array_members);
2014-08-25 17:24:55 +00:00
add_assoc_long(array_group, "gid", g->gr_gid);
return 1;
}
2008-05-04 09:34:16 +00:00
/* }}} */
1999-12-03 13:13:48 +00:00
/*
POSIX.1, 5.5.1 unlink()
POSIX.1, 5.5.2 rmdir()
POSIX.1, 5.5.3 rename()
POSIX.1, 5.6.x stat(), chmod(), utime() already supported by PHP.
*/
/* {{{ proto bool posix_access(string file [, int mode])
Determine accessibility of a file (POSIX.1 5.6.3) */
PHP_FUNCTION(posix_access)
{
2014-08-25 17:24:55 +00:00
zend_long mode = 0;
int filename_len, ret;
char *filename, *path;
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "p|l", &filename, &filename_len, &mode) == FAILURE) {
RETURN_FALSE;
}
path = expand_filepath(filename, NULL TSRMLS_CC);
2006-09-16 17:41:57 +00:00
if (!path) {
POSIX_G(last_error) = EIO;
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
if (php_check_open_basedir_ex(path, 0 TSRMLS_CC)) {
efree(path);
POSIX_G(last_error) = EPERM;
RETURN_FALSE;
}
ret = access(path, mode);
efree(path);
if (ret) {
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
RETURN_TRUE;
}
/* }}} */
/*
1999-12-03 13:13:48 +00:00
POSIX.1, 6.x most I/O functions already supported by PHP.
POSIX.1, 7.x tty functions, TODO
POSIX.1, 8.x interactions with other C language functions
POSIX.1, 9.x system database access
*/
1999-12-03 13:13:48 +00:00
/* {{{ proto array posix_getgrnam(string groupname)
1999-12-03 13:13:48 +00:00
Group database access (POSIX.1, 9.2.1) */
PHP_FUNCTION(posix_getgrnam)
{
char *name;
struct group *g;
int name_len;
#if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
struct group gbuf;
long buflen;
char *buf;
#endif
1999-12-03 13:13:48 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
#if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
if (buflen < 1) {
RETURN_FALSE;
}
buf = emalloc(buflen);
g = &gbuf;
if (getgrnam_r(name, g, buf, buflen, &g) || g == NULL) {
POSIX_G(last_error) = errno;
efree(buf);
RETURN_FALSE;
}
#else
if (NULL == (g = getgrnam(name))) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
#endif
array_init(return_value);
if (!php_posix_group_to_array(g, return_value)) {
2006-12-21 01:00:58 +00:00
zval_dtor(return_value);
2003-01-19 00:45:53 +00:00
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix group to array");
RETVAL_FALSE;
1999-12-03 13:13:48 +00:00
}
#if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
efree(buf);
#endif
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto array posix_getgrgid(long gid)
Group database access (POSIX.1, 9.2.1) */
PHP_FUNCTION(posix_getgrgid)
{
2014-08-25 17:24:55 +00:00
zend_long gid;
2007-02-10 00:50:38 +00:00
#if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
2006-11-30 00:35:15 +00:00
int ret;
struct group _g;
2008-04-11 11:00:03 +00:00
struct group *retgrptr = NULL;
long grbuflen;
2006-12-21 01:00:58 +00:00
char *grbuf;
2006-11-30 00:35:15 +00:00
#endif
struct group *g;
1999-12-03 13:13:48 +00:00
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &gid) == FAILURE) {
RETURN_FALSE;
}
#if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
2006-12-21 01:00:58 +00:00
grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
if (grbuflen < 1) {
RETURN_FALSE;
}
2006-12-21 01:00:58 +00:00
grbuf = emalloc(grbuflen);
2006-11-30 00:35:15 +00:00
ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
2008-04-11 11:00:03 +00:00
if (ret || retgrptr == NULL) {
2006-11-30 00:35:15 +00:00
POSIX_G(last_error) = ret;
efree(grbuf);
RETURN_FALSE;
}
g = &_g;
#else
if (NULL == (g = getgrgid(gid))) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
2006-11-30 00:35:15 +00:00
#endif
array_init(return_value);
if (!php_posix_group_to_array(g, return_value)) {
2006-12-21 01:00:58 +00:00
zval_dtor(return_value);
2003-01-19 00:45:53 +00:00
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix group struct to array");
RETVAL_FALSE;
1999-12-03 13:13:48 +00:00
}
#if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
efree(grbuf);
#endif
1999-12-03 13:13:48 +00:00
}
/* }}} */
2008-05-04 09:34:16 +00:00
int php_posix_passwd_to_array(struct passwd *pw, zval *return_value) /* {{{ */
{
if (NULL == pw)
return 0;
if (NULL == return_value || Z_TYPE_P(return_value) != IS_ARRAY)
return 0;
2014-04-15 11:40:40 +00:00
add_assoc_string(return_value, "name", pw->pw_name);
add_assoc_string(return_value, "passwd", pw->pw_passwd);
2014-08-25 17:24:55 +00:00
add_assoc_long (return_value, "uid", pw->pw_uid);
add_assoc_long (return_value, "gid", pw->pw_gid);
2014-04-15 11:40:40 +00:00
add_assoc_string(return_value, "gecos", pw->pw_gecos);
add_assoc_string(return_value, "dir", pw->pw_dir);
add_assoc_string(return_value, "shell", pw->pw_shell);
return 1;
}
2008-05-04 09:34:16 +00:00
/* }}} */
1999-12-03 13:13:48 +00:00
/* {{{ proto array posix_getpwnam(string groupname)
User database access (POSIX.1, 9.2.2) */
PHP_FUNCTION(posix_getpwnam)
{
struct passwd *pw;
char *name;
int name_len;
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
struct passwd pwbuf;
long buflen;
char *buf;
#endif
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
RETURN_FALSE;
}
1999-12-03 13:13:48 +00:00
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
if (buflen < 1) {
RETURN_FALSE;
}
buf = emalloc(buflen);
pw = &pwbuf;
if (getpwnam_r(name, pw, buf, buflen, &pw) || pw == NULL) {
efree(buf);
POSIX_G(last_error) = errno;
RETURN_FALSE;
}
#else
if (NULL == (pw = getpwnam(name))) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
#endif
array_init(return_value);
if (!php_posix_passwd_to_array(pw, return_value)) {
2006-12-21 01:00:58 +00:00
zval_dtor(return_value);
2003-01-19 00:45:53 +00:00
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix passwd struct to array");
RETVAL_FALSE;
}
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
efree(buf);
#endif
1999-12-03 13:13:48 +00:00
}
/* }}} */
/* {{{ proto array posix_getpwuid(long uid)
User database access (POSIX.1, 9.2.2) */
PHP_FUNCTION(posix_getpwuid)
{
2014-08-25 17:24:55 +00:00
zend_long uid;
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
2006-11-30 00:35:15 +00:00
struct passwd _pw;
struct passwd *retpwptr = NULL;
long pwbuflen;
2006-12-21 01:00:58 +00:00
char *pwbuf;
2006-11-30 00:35:15 +00:00
int ret;
#endif
1999-12-03 13:13:48 +00:00
struct passwd *pw;
2006-11-30 00:35:15 +00:00
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) {
RETURN_FALSE;
}
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
2006-12-21 01:00:58 +00:00
pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
if (pwbuflen < 1) {
RETURN_FALSE;
}
2006-12-21 01:00:58 +00:00
pwbuf = emalloc(pwbuflen);
2006-11-30 00:35:15 +00:00
ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
2008-04-11 11:00:03 +00:00
if (ret || retpwptr == NULL) {
2006-11-30 00:35:15 +00:00
POSIX_G(last_error) = ret;
efree(pwbuf);
RETURN_FALSE;
}
pw = &_pw;
#else
if (NULL == (pw = getpwuid(uid))) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
}
2006-11-30 00:35:15 +00:00
#endif
array_init(return_value);
if (!php_posix_passwd_to_array(pw, return_value)) {
2006-12-21 01:00:58 +00:00
zval_dtor(return_value);
2003-01-19 00:45:53 +00:00
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to convert posix passwd struct to array");
RETVAL_FALSE;
}
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
efree(pwbuf);
#endif
1999-12-03 13:13:48 +00:00
}
/* }}} */
#ifdef HAVE_GETRLIMIT
#define UNLIMITED_STRING "unlimited"
/* {{{ posix_addlimit
*/
2002-03-06 11:26:05 +00:00
static int posix_addlimit(int limit, char *name, zval *return_value TSRMLS_DC) {
1999-12-03 13:13:48 +00:00
int result;
struct rlimit rl;
char hard[80];
char soft[80];
snprintf(hard, 80, "hard %s", name);
snprintf(soft, 80, "soft %s", name);
result = getrlimit(limit, &rl);
if (result < 0) {
POSIX_G(last_error) = errno;
1999-12-03 13:13:48 +00:00
return FAILURE;
}
if (rl.rlim_cur == RLIM_INFINITY) {
2014-04-15 11:40:40 +00:00
add_assoc_stringl(return_value, soft, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1);
} else {
2014-08-25 17:24:55 +00:00
add_assoc_long(return_value, soft, rl.rlim_cur);
}
1999-12-03 13:13:48 +00:00
if (rl.rlim_max == RLIM_INFINITY) {
2014-04-15 11:40:40 +00:00
add_assoc_stringl(return_value, hard, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1);
} else {
2014-08-25 17:24:55 +00:00
add_assoc_long(return_value, hard, rl.rlim_max);
}
1999-12-03 13:13:48 +00:00
return SUCCESS;
}
/* }}} */
1999-12-03 13:13:48 +00:00
/* {{{ limits[]
*/
1999-12-03 13:13:48 +00:00
struct limitlist {
int limit;
char *name;
} limits[] = {
#ifdef RLIMIT_CORE
{ RLIMIT_CORE, "core" },
#endif
#ifdef RLIMIT_DATA
{ RLIMIT_DATA, "data" },
#endif
#ifdef RLIMIT_STACK
{ RLIMIT_STACK, "stack" },
#endif
#ifdef RLIMIT_VMEM
{ RLIMIT_VMEM, "virtualmem" },
#endif
#ifdef RLIMIT_AS
{ RLIMIT_AS, "totalmem" },
#endif
#ifdef RLIMIT_RSS
{ RLIMIT_RSS, "rss" },
#endif
#ifdef RLIMIT_NPROC
{ RLIMIT_NPROC, "maxproc" },
#endif
#ifdef RLIMIT_MEMLOCK
{ RLIMIT_MEMLOCK, "memlock" },
#endif
#ifdef RLIMIT_CPU
{ RLIMIT_CPU, "cpu" },
#endif
#ifdef RLIMIT_FSIZE
{ RLIMIT_FSIZE, "filesize" },
#endif
#ifdef RLIMIT_NOFILE
{ RLIMIT_NOFILE, "openfiles" },
#endif
#ifdef RLIMIT_OFILE
{ RLIMIT_OFILE, "openfiles" },
#endif
{ 0, NULL }
};
/* }}} */
1999-12-03 13:13:48 +00:00
2003-07-19 19:23:34 +00:00
/* {{{ proto array posix_getrlimit(void)
1999-12-03 13:13:48 +00:00
Get system resource consumption limits (This is not a POSIX function, but a BSDism and a SVR4ism. We compile conditionally) */
PHP_FUNCTION(posix_getrlimit)
{
struct limitlist *l = NULL;
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
array_init(return_value);
1999-12-03 13:13:48 +00:00
for (l=limits; l->name; l++) {
2006-12-21 01:00:58 +00:00
if (posix_addlimit(l->limit, l->name, return_value TSRMLS_CC) == FAILURE) {
zval_dtor(return_value);
1999-12-03 13:13:48 +00:00
RETURN_FALSE;
2006-12-21 01:00:58 +00:00
}
1999-12-03 13:13:48 +00:00
}
}
/* }}} */
#endif /* HAVE_GETRLIMIT */
/* {{{ proto int posix_get_last_error(void)
Retrieve the error number set by the last posix function which failed. */
PHP_FUNCTION(posix_get_last_error)
{
2004-04-18 21:49:10 +00:00
PHP_POSIX_NO_ARGS;
2014-08-25 17:24:55 +00:00
RETURN_LONG(POSIX_G(last_error));
}
/* }}} */
/* {{{ proto string posix_strerror(int errno)
Retrieve the system error message associated with the given errno. */
PHP_FUNCTION(posix_strerror)
{
2014-08-25 17:24:55 +00:00
zend_long error;
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &error) == FAILURE) {
RETURN_FALSE;
}
2014-05-06 10:50:54 +00:00
RETURN_STRING(strerror(error));
1999-12-03 13:13:48 +00:00
}
/* }}} */
#endif
#ifdef HAVE_INITGROUPS
2006-10-02 07:58:13 +00:00
/* {{{ proto bool posix_initgroups(string name, int base_group_id)
2006-06-19 02:19:13 +00:00
Calculate the group access list for the user specified in name. */
PHP_FUNCTION(posix_initgroups)
{
2014-08-25 17:24:55 +00:00
zend_long basegid;
2006-06-19 02:19:13 +00:00
char *name;
int name_len;
2014-08-25 17:24:55 +00:00
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &name, &name_len, &basegid) == FAILURE) {
2006-06-19 02:19:13 +00:00
RETURN_FALSE;
}
if (name_len == 0) {
RETURN_FALSE;
}
2006-06-19 02:19:13 +00:00
RETURN_BOOL(!initgroups((const char *)name, basegid));
}
/* }}} */
#endif
2006-06-19 02:19:13 +00:00
1999-12-03 13:13:48 +00:00
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
1999-12-03 13:13:48 +00:00
*/