⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posix.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 *//* {{{ 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 + -