[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pecl-cvs
Subject:    [PECL-CVS] =?utf-8?q?svn:_/pecl/dio/trunk/_dio.c_tests/002.phpt_tests/003.phpt?=
From:       Melanie_Rhianna_Lewis <cyberspice () php ! net>
Date:       2011-10-28 20:07:01
Message-ID: svn-cyberspice-1319832421-318535-2116900083 () svn ! php ! net
[Download RAW message or body]

cyberspice                               Fri, 28 Oct 2011 20:07:01 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=318535

Log:
Added dio_fdopen() and dio_dup().

dio_fdopen() returns a resource for an integer file descriptor. For example
dio_fdopen(1) will return a dio resource for STDOUT.

dio_dup() will duplicate a dio resource's underlying file descriptor returning
a new resource for the new file descriptor. For example dio_dup(dio_fdopen(1))
will return a dio resource for a duplicate of STDOUT.

Files modified:
  dio.c

Files added:
  tests/002.phpt
  tests/003.phpt

Changed paths:
    U   pecl/dio/trunk/dio.c
    A   pecl/dio/trunk/tests/002.phpt
    A   pecl/dio/trunk/tests/003.phpt

Modified: pecl/dio/trunk/dio.c
===================================================================
--- pecl/dio/trunk/dio.c	2011-10-28 19:36:53 UTC (rev 318534)
+++ pecl/dio/trunk/dio.c	2011-10-28 20:07:01 UTC (rev 318535)
@@ -111,14 +111,73 @@
 		RETURN_FALSE;
 	}

+	if (!new_php_fd(&f, fd)) {
+		RETURN_FALSE;
+	}

+	ZEND_REGISTER_RESOURCE(return_value, f, le_fd);
+}
+/* }}} */
+
+#ifndef PHP_WIN32
+
+/* {{{ proto resource dio_fdopen(int fd)
+   Returns a resource for the specified file descriptor. */
+PHP_FUNCTION(dio_fdopen)
+{
+	php_fd_t *f;
+	long lfd;
+	int fd;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lfd) == FAILURE) {
+		return;
+	}
+
+	fd = (int)lfd;
+
+	if ((fcntl(fd, F_GETFL, 0) == -1) && (errno == EBADFD)) {
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad file descriptor %d", fd);
+		RETURN_FALSE;
+	}
+
 	if (!new_php_fd(&f, fd)) {
 		RETURN_FALSE;
 	}
+
 	ZEND_REGISTER_RESOURCE(return_value, f, le_fd);
 }
 /* }}} */

+
+/* {{{ proto resource dio_dup(resource fd)
+   Opens a duplicate of the specified open resource. */
+PHP_FUNCTION(dio_dup)
+{
+	zval     *r_fd;
+	php_fd_t *f, *df;
+	int dfd;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &r_fd) == FAILURE) {
+		return;
+	}
+
+	ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
+
+	dfd = dup(f->fd);
+	if (dfd == -1) {
+		php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot duplication file descriptor \
%d: %s", f->fd, strerror(errno)); +		RETURN_FALSE;
+	}
+
+	if (!new_php_fd(&df, dfd)) {
+		RETURN_FALSE;
+	}
+
+	ZEND_REGISTER_RESOURCE(return_value, df, le_fd);
+}
+/* }}} */
+#endif
+
 /* {{{ proto string dio_read(resource fd[, int n])
    Read n bytes from fd and return them, if n is not specified, read 1k */
 PHP_FUNCTION(dio_read)
@@ -178,7 +237,7 @@

 	res = write(f->fd, data, trunc_len ? trunc_len : data_len);
 	if (res == -1) {
-		php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot write data to file descriptor \
%d, %s", f->fd, strerror(errno)); +		php_error_docref(NULL TSRMLS_CC, E_WARNING, \
"cannot write data to file descriptor %d: %s", f->fd, strerror(errno));  }

 	RETURN_LONG(res);
@@ -648,6 +707,15 @@
 	ZEND_ARG_INFO(0, mode)
 ZEND_END_ARG_INFO()

+ZEND_BEGIN_ARG_INFO_EX(dio_fdopen_args, 0, 0, 1)
+	ZEND_ARG_INFO(0, fd)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(dio_dup_args, 0, 0, 1)
+	ZEND_ARG_INFO(0, fd)
+ZEND_END_ARG_INFO()
+
+
 ZEND_BEGIN_ARG_INFO_EX(dio_read_args, 0, 0, 1)
 	ZEND_ARG_INFO(0, fd)
 	ZEND_ARG_INFO(0, n)
@@ -715,6 +783,8 @@
 	/* Legacy functions (Deprecated - See dio_legacy.c) */
 	PHP_FE(dio_open, dio_open_args)
 #ifndef PHP_WIN32
+	PHP_FE(dio_fdopen, dio_fdopen_args)
+	PHP_FE(dio_dup, dio_dup_args)
 	PHP_FE(dio_truncate, dio_truncate_args)
 #endif
 	PHP_FE(dio_stat, dio_stat_args)

Added: pecl/dio/trunk/tests/002.phpt
===================================================================
--- pecl/dio/trunk/tests/002.phpt	                        (rev 0)
+++ pecl/dio/trunk/tests/002.phpt	2011-10-28 20:07:01 UTC (rev 318535)
@@ -0,0 +1,18 @@
+--TEST--
+Test dio legacy fdopen
+--SKIPIF--
+<?php
+	if (!extension_loaded("dio")) print "skip";
+	if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') print "skip";
+?>
+--FILE--
+<?php
+	$f = dio_fdopen(1);
+	if ($f) {
+		echo "Legacy fdopen passed";
+	} else {
+		echo "Legacy fdopen failed";
+	}
+?>
+--EXPECT--
+Legacy fdopen passed

Added: pecl/dio/trunk/tests/003.phpt
===================================================================
--- pecl/dio/trunk/tests/003.phpt	                        (rev 0)
+++ pecl/dio/trunk/tests/003.phpt	2011-10-28 20:07:01 UTC (rev 318535)
@@ -0,0 +1,23 @@
+--TEST--
+Test dio legacy dup
+--SKIPIF--
+<?php
+	if (!extension_loaded("dio")) print "skip";
+	if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') print "skip";
+?>
+--FILE--
+<?php
+	$f = dio_open("/dev/null",O_RDONLY);
+	if ($f) {
+		$df = dio_dup($f);
+		if ($f) {
+			echo "Legacy dup passed";
+		} else {
+			echo "Legacy dup failed";
+		}
+	} else {
+		echo "Legacy dup precondition failed";
+	}
+?>
+--EXPECT--
+Legacy dup passed



-- 
PECL CVS Mailing List 
To unsubscribe, visit: http://www.php.net/unsub.php

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic