📄 posix.c
字号:
*//* {{{ proto array posix_times(void) Get process times (POSIX.1, 4.5.2) */PHP_FUNCTION(posix_times){ struct tms t; clock_t ticks; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if((ticks = times(&t)) < 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_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 */}/* }}} *//* POSIX.1, 4.6.1 getenv() - Environment Access already covered by PHP*//* {{{ proto string posix_ctermid(void) Generate terminal path name (POSIX.1, 4.7.1) */#ifdef HAVE_CTERMIDPHP_FUNCTION(posix_ctermid){ char buffer[L_ctermid]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if (NULL == ctermid(buffer)) { /* Found no documentation how the defined behaviour is when this * function fails */ POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_STRING(buffer, 1);}#endif/* }}} *//* Checks if the provides resource is a stream and if it provides a file descriptor */static int php_posix_stream_get_fd(zval *zfp, int *fd TSRMLS_DC){ php_stream *stream; 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) == 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;}/* {{{ proto string posix_ttyname(int fd) Determine terminal device name (POSIX.1, 4.7.2) */PHP_FUNCTION(posix_ttyname){ zval *z_fd; char *p; int fd; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_fd) == FAILURE) { RETURN_FALSE; } switch (Z_TYPE_P(z_fd)) { case IS_RESOURCE: if (!php_posix_stream_get_fd(z_fd, &fd TSRMLS_CC)) { RETURN_FALSE; } break; default: convert_to_long(z_fd); fd = Z_LVAL_P(z_fd); } if (NULL == (p = ttyname(fd))) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_STRING(p, 1);}/* }}} *//* {{{ proto bool posix_isatty(int fd) Determine if filedesc is a tty (POSIX.1, 4.7.1) */PHP_FUNCTION(posix_isatty){ zval *z_fd; int fd; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &z_fd) == FAILURE) { RETURN_FALSE; } switch (Z_TYPE_P(z_fd)) { case IS_RESOURCE: if (!php_posix_stream_get_fd(z_fd, &fd TSRMLS_CC)) { RETURN_FALSE; } break; default: convert_to_long(z_fd); fd = Z_LVAL_P(z_fd); } if (isatty(fd)) { RETURN_TRUE; } else { RETURN_FALSE; }}/* }}} *//* 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) Get working directory pathname (POSIX.1, 5.2.2) */PHP_FUNCTION(posix_getcwd){ char buffer[MAXPATHLEN]; char *p; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } p = VCWD_GETCWD(buffer, MAXPATHLEN); if (!p) { POSIX_G(last_error) = errno; RETURN_FALSE; } RETURN_STRING(buffer, 1);}/* }}} *//* POSIX.1, 5.3.x open(), creat(), umask() POSIX.1, 5.4.1 link() already supported by PHP. *//* {{{ proto bool posix_mkfifo(string pathname, int mode) Make a FIFO special file (POSIX.1, 5.4.2) */#ifdef HAVE_MKFIFOPHP_FUNCTION(posix_mkfifo){ char *path; int path_len; long mode; int result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &path, &path_len, &mode) == FAILURE) { RETURN_FALSE; } if (PG(safe_mode) && (!php_checkuid(path, NULL, CHECKUID_ALLOW_ONLY_DIR))) { RETURN_FALSE; } result = mkfifo(path, mode); 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. */int php_posix_group_to_array(struct group *g, zval *array_group) { zval *array_members; int count; if (NULL == g) return 0; if (array_group == NULL || Z_TYPE_P(array_group) != IS_ARRAY) return 0; MAKE_STD_ZVAL(array_members); if (array_init(array_members) == FAILURE) return 0; add_assoc_string(array_group, "name", g->gr_name, 1); add_assoc_string(array_group, "passwd", g->gr_passwd, 1); for (count=0; g->gr_mem[count] != NULL; count++) { add_next_index_string(array_members, g->gr_mem[count], 1); } zend_hash_update(Z_ARRVAL_P(array_group), "members", sizeof("members"), (void*)&array_members, sizeof(zval*), NULL); add_assoc_long(array_group, "gid", g->gr_gid); return 1;}/* POSIX.1, 5.5.1 unlink() POSIX.1, 5.5.2 rmdir() POSIX.1, 5.5.3 rename() POSIX.1, 5.6.x stat(), access(), chmod(), utime() already supported by PHP (access() not supported, because it is braindead and dangerous and gives outdated results). 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 *//* {{{ proto array posix_getgrnam(string groupname) Group database access (POSIX.1, 9.2.1) */PHP_FUNCTION(posix_getgrnam){ char *name; struct group *g; int name_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } if (NULL == (g = getgrnam(name))) { 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; } if (!php_posix_group_to_array(g, return_value)) { zval_dtor(return_value); php_error(E_WARNING, "%s() unable to convert posix group to array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; }}/* }}} *//* {{{ proto array posix_getgrgid(long gid) Group database access (POSIX.1, 9.2.1) */PHP_FUNCTION(posix_getgrgid){ long gid; struct group *g; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &gid) == FAILURE) { RETURN_FALSE; } if (NULL == (g = getgrgid(gid))) { 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; } if (!php_posix_group_to_array(g, return_value)) { zval_dtor(return_value); php_error(E_WARNING, "%s() unable to convert posix group struct to array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; }}/* }}} */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; add_assoc_string(return_value, "name", pw->pw_name, 1); add_assoc_string(return_value, "passwd", pw->pw_passwd, 1); add_assoc_long (return_value, "uid", pw->pw_uid); add_assoc_long (return_value, "gid", pw->pw_gid); add_assoc_string(return_value, "gecos", pw->pw_gecos, 1); add_assoc_string(return_value, "dir", pw->pw_dir, 1); add_assoc_string(return_value, "shell", pw->pw_shell, 1); return 1;}/* {{{ 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 (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { RETURN_FALSE; } if (NULL == (pw = getpwnam(name))) { POSIX_G(last_error) = errno; RETURN_FALSE; } if (array_init(return_value) == FAILURE) { RETURN_FALSE; } if (!php_posix_passwd_to_array(pw, return_value)) { zval_dtor(return_value); php_error(E_WARNING, "%s() unable to convert posix passwd struct to array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; }}/* }}} *//* {{{ proto array posix_getpwuid(long uid) User database access (POSIX.1, 9.2.2) */PHP_FUNCTION(posix_getpwuid){ long uid; struct passwd *pw; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) { RETURN_FALSE; } if (NULL == (pw = getpwuid(uid))) { POSIX_G(last_error) = errno; RETURN_FALSE; } if (array_init(return_value) == FAILURE) { RETURN_FALSE; } if (!php_posix_passwd_to_array(pw, return_value)) { zval_dtor(return_value); php_error(E_WARNING, "%s() unable to convert posix passwd struct to array", get_active_function_name(TSRMLS_C)); RETURN_FALSE; }}/* }}} */#ifdef HAVE_GETRLIMIT#define UNLIMITED_STRING "unlimited"/* {{{ posix_addlimit */static int posix_addlimit(int limit, char *name, zval *return_value TSRMLS_DC) { 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; return FAILURE; } if (rl.rlim_cur == RLIM_INFINITY) { add_assoc_stringl(return_value, soft, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1); } else { add_assoc_long(return_value, soft, rl.rlim_cur); } if (rl.rlim_max == RLIM_INFINITY) { add_assoc_stringl(return_value, hard, UNLIMITED_STRING, sizeof(UNLIMITED_STRING)-1, 1); } else { add_assoc_long(return_value, hard, rl.rlim_max); } return SUCCESS;}/* }}} *//* {{{ limits[] */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 }};/* }}} *//* {{{ proto int posix_getrlimit(void) 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; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } if (array_init(return_value) == FAILURE) { RETURN_FALSE; } for (l=limits; l->name; l++) { if (posix_addlimit(l->limit, l->name, return_value TSRMLS_CC) == FAILURE) { zval_dtor(return_value); RETURN_FALSE; } }}/* }}} */#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){ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { RETURN_FALSE; } 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){ long error; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &error) == FAILURE) { RETURN_FALSE; } RETURN_STRING(strerror(error), 1);}/* }}} */#endif/* * Local variables: * tab-width: 4 * c-basic-offset: 4 * End: * vim600: sw=4 ts=4 fdm=marker * vim<600: sw=4 ts=4 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -