📄 posix.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | 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: | | 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. | +----------------------------------------------------------------------+ | Author: Kristian Koehntopp <kris@koehntopp.de> | +----------------------------------------------------------------------+ *//* $Id: posix.c,v 1.51.2.4.2.3 2007/01/01 09:46:46 sebastian Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "ext/standard/info.h"#include "ext/standard/php_string.h"#include "php_posix.h"#if HAVE_POSIX#ifdef HAVE_SYS_TIME_H#include <sys/time.h>#endif#include <unistd.h>#include <sys/resource.h>#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>ZEND_DECLARE_MODULE_GLOBALS(posix)/* {{{ posix_functions[] */function_entry posix_functions[] = { /* POSIX.1, 3.3 */ PHP_FE(posix_kill, NULL) /* POSIX.1, 4.1 */ PHP_FE(posix_getpid, NULL) PHP_FE(posix_getppid, NULL) /* POSIX.1, 4.2 */ PHP_FE(posix_getuid, NULL) PHP_FE(posix_setuid, NULL) PHP_FE(posix_geteuid, NULL)#ifdef HAVE_SETEUID PHP_FE(posix_seteuid, NULL)#endif PHP_FE(posix_getgid, NULL) PHP_FE(posix_setgid, NULL) PHP_FE(posix_getegid, NULL)#ifdef HAVE_SETEGID PHP_FE(posix_setegid, NULL)#endif#ifdef HAVE_GETGROUPS PHP_FE(posix_getgroups, NULL)#endif#ifdef HAVE_GETLOGIN PHP_FE(posix_getlogin, NULL)#endif /* POSIX.1, 4.3 */ PHP_FE(posix_getpgrp, NULL)#ifdef HAVE_SETSID PHP_FE(posix_setsid, NULL)#endif PHP_FE(posix_setpgid, NULL) /* Non-Posix functions which are common */#ifdef HAVE_GETPGID PHP_FE(posix_getpgid, NULL)#endif /* HAVE_GETPGID */#ifdef HAVE_GETSID PHP_FE(posix_getsid, NULL)#endif /* HAVE_GETSID */ /* POSIX.1, 4.4 */ PHP_FE(posix_uname, NULL) /* POSIX.1, 4.5 */ PHP_FE(posix_times, NULL) /* POSIX.1, 4.7 */#ifdef HAVE_CTERMID PHP_FE(posix_ctermid, NULL)#endif PHP_FE(posix_ttyname, NULL) PHP_FE(posix_isatty, NULL) /* POSIX.1, 5.2 */ PHP_FE(posix_getcwd, NULL) /* POSIX.1, 5.4 */#ifdef HAVE_MKFIFO PHP_FE(posix_mkfifo, NULL)#endif /* POSIX.1, 9.2 */ PHP_FE(posix_getgrnam, NULL) PHP_FE(posix_getgrgid, NULL) PHP_FE(posix_getpwnam, NULL) PHP_FE(posix_getpwuid, NULL)#ifdef HAVE_GETRLIMIT PHP_FE(posix_getrlimit, NULL)#endif PHP_FE(posix_get_last_error, NULL) PHP_FALIAS(posix_errno, posix_get_last_error, NULL) PHP_FE(posix_strerror, NULL) {NULL, NULL, NULL}};/* }}} *//* {{{ PHP_MINFO_FUNCTION */static PHP_MINFO_FUNCTION(posix){ php_info_print_table_start(); php_info_print_table_row(2, "Revision", "$Revision: 1.51.2.4.2.3 $"); php_info_print_table_end();}/* }}} */static void php_posix_init_globals(zend_posix_globals *posix_globals TSRMLS_DC){ posix_globals->last_error = 0;}/* {{{ PHP_MINIT_FUNCTION(posix) */static PHP_MINIT_FUNCTION(posix){ ZEND_INIT_MODULE_GLOBALS(posix, php_posix_init_globals, NULL); return SUCCESS;}/* }}} */static PHP_MINFO_FUNCTION(posix);/* {{{ posix_module_entry */zend_module_entry posix_module_entry = { STANDARD_MODULE_HEADER, "posix", posix_functions, PHP_MINIT(posix), NULL, NULL, NULL, PHP_MINFO(posix), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_POSIXZEND_GET_MODULE(posix)#endif/* {{{ proto bool posix_kill(int pid, int sig) Send a signal to a process (POSIX.1, 3.3.2) */PHP_FUNCTION(posix_kill){ long pid, sig; 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; RETURN_FALSE; } RETURN_TRUE;}/* }}} *//* {{{ proto int posix_getpid(void) Get the current process id (POSIX.1, 4.1.1) */PHP_FUNCTION(posix_getpid){ pid_t pid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } pid = getpid(); RETURN_LONG(pid);}/* }}} *//* {{{ proto int posix_getppid(void) Get the parent process id (POSIX.1, 4.1.1) */PHP_FUNCTION(posix_getppid){ pid_t ppid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } ppid = getppid(); RETURN_LONG(ppid);}/* }}} *//* {{{ proto int posix_getuid(void) Get the current user id (POSIX.1, 4.2.1) */PHP_FUNCTION(posix_getuid){ uid_t uid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } uid = getuid(); RETURN_LONG(uid);}/* }}} *//* {{{ proto int posix_getgid(void) Get the current group id (POSIX.1, 4.2.1) */PHP_FUNCTION(posix_getgid){ gid_t gid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } gid = getgid(); RETURN_LONG(gid);}/* }}} *//* {{{ proto int posix_geteuid(void) Get the current effective user id (POSIX.1, 4.2.1) */PHP_FUNCTION(posix_geteuid){ uid_t uid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } uid = geteuid(); RETURN_LONG(uid);}/* }}} *//* {{{ proto int posix_getegid(void) Get the current effective group id (POSIX.1, 4.2.1) */PHP_FUNCTION(posix_getegid){ gid_t gid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } gid = getegid(); RETURN_LONG(gid); }/* }}} *//* {{{ proto bool posix_setuid(long uid) Set user id (POSIX.1, 4.2.2) */PHP_FUNCTION(posix_setuid){ long uid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) { RETURN_FALSE; } if (setuid(uid) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_TRUE;}/* }}} *//* {{{ proto bool posix_setgid(int uid) Set group id (POSIX.1, 4.2.2) */PHP_FUNCTION(posix_setgid){ long gid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &gid) == FAILURE) { RETURN_FALSE; } if (setgid(gid) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_TRUE;}/* }}} *//* {{{ proto bool posix_seteuid(long uid) Set effective user id */#ifdef HAVE_SETEUIDPHP_FUNCTION(posix_seteuid){ long euid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &euid) == FAILURE) { RETURN_FALSE; } if (seteuid(euid) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_TRUE;}#endif/* }}} *//* {{{ proto bool posix_setegid(long uid) Set effective group id */#ifdef HAVE_SETEGIDPHP_FUNCTION(posix_setegid){ long egid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &egid) == FAILURE) { RETURN_FALSE; } if (setegid(egid) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_TRUE;}#endif/* }}} *//* {{{ proto array posix_getgroups(void) Get supplementary group id's (POSIX.1, 4.2.3) */#ifdef HAVE_GETGROUPSPHP_FUNCTION(posix_getgroups){ gid_t gidlist[NGROUPS_MAX]; int result; int i; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if ((result = getgroups(NGROUPS_MAX, gidlist)) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } if (array_init(return_value) == FAILURE) { /* TODO: Should we issue a warning here so we don't have ambiguity * with the above return value ? */ RETURN_FALSE; } for (i=0; i<result; i++) { add_next_index_long(return_value, gidlist[i]); }}#endif/* }}} *//* {{{ proto string posix_getlogin(void) Get user name (POSIX.1, 4.2.4) */#ifdef HAVE_GETLOGINPHP_FUNCTION(posix_getlogin){ char *p; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if (NULL == (p = getlogin())) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_STRING(p, 1);}#endif/* }}} *//* {{{ proto int posix_getpgrp(void) Get current process group id (POSIX.1, 4.3.1) */PHP_FUNCTION(posix_getpgrp){ pid_t pgrp; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } pgrp = getpgrp(); RETURN_LONG(pgrp);}/* }}} *//* {{{ proto int posix_setsid(void) Create session and set process group id (POSIX.1, 4.3.2) */#ifdef HAVE_SETSIDPHP_FUNCTION(posix_setsid){ pid_t sid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } sid = setsid(); RETURN_LONG(sid);}#endif/* }}} *//* {{{ proto bool posix_setpgid(int pid, int pgid) Set process group id for job control (POSIX.1, 4.3.3) */PHP_FUNCTION(posix_setpgid){ long pid, pgid; 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; RETURN_FALSE; } RETURN_TRUE;}/* }}} *//* {{{ proto int posix_getpgid(void) Get the process group id of the specified process (This is not a POSIX function, but a SVR4ism, so we compile conditionally) */#ifdef HAVE_GETPGIDPHP_FUNCTION(posix_getpgid){ long pid; pid_t pgid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &pid) == FAILURE) { RETURN_FALSE; } if ((pgid = getpgid(pid)) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_LONG(pgid);}#endif/* }}} *//* {{{ proto int posix_getsid(void) Get process group id of session leader (This is not a POSIX function, but a SVR4ism, so be compile conditionally) */#ifdef HAVE_GETSIDPHP_FUNCTION(posix_getsid){ long pid; pid_t sid; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &pid) == FAILURE) { RETURN_FALSE; } if ((sid = getsid(pid)) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_LONG(sid);}#endif/* }}} *//* {{{ proto array posix_uname(void) Get system name (POSIX.1, 4.4.1) */PHP_FUNCTION(posix_uname){ struct utsname u; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if (uname(&u) < 0) { POSIX_G(last_error) = errno; RETURN_FALSE; } if (array_init(return_value) == FAILURE) { /* TODO: Should we issue a warning here so we don't have ambiguity * with the above return value ? */ RETURN_FALSE; } add_assoc_string(return_value, "sysname", u.sysname, 1); add_assoc_string(return_value, "nodename", u.nodename, 1); add_assoc_string(return_value, "release", u.release, 1); add_assoc_string(return_value, "version", u.version, 1); add_assoc_string(return_value, "machine", u.machine, 1);#ifdef _GNU_SOURCE add_assoc_string(return_value, "domainname", u.domainname, 1);#endif}/* }}} *//* POSIX.1, 4.5.1 time() - Get System Time already covered by PHP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -