a) export the ioctl defines DIO_TIOCMGET etc.
b) write a generic dio_ioctl($fh,$type,$args) function, with switch/case on the $type
that way implementing more features for ioctl would just be a matter of adding the define and handling any special args/return values.??
(it would also follow the ioctl documenation a bit better..)
The tcsetattr bit looks OK.
Regards Alan
Greg MacLellan wrote:
Added two functions:
dio_modemget(resource fd) - returns the control line status of a serial port
dio_read_waiting(resource fd) - returns the number of bytes waiting in the input buffer
(note: i have submitted a patch for dio_modemget before, but since current CVS doesn't have it, I'm sending it again)
Modified dio_tcsetattr() so the array accepts two more parameters:
'hwflow' - set to zero to turn hardware flow control (CRTSCTS) off (defaults to on)
'swflow' - set to non-zero to turn software flow control (XON/XOFF) on (defaults to off)
Note that the defaults maintain the old behaviour. This change to dio_tcsetattr() is also attached seperately as dio_tcsetattr.patch.txt, but it is also included in dio_changes.patch.txt.
dio_modemget() was written to get the status of a UPS. Flow control changes were made to be able to communicate with a serial device that required flow control off (and that was a fun problem to track down..). dio_read_waiting() was also written to communicate with the serial device, as I was having problems using non-blocking, and with blocking read() would sometimes wait forever.
fyi, the device is a "weatherduck" http://www.itwatchdogs.com/duckdetails.shtml
ttyl, greg -- Greg MacLellan
------------------------------------------------------------------------
Index: php-src/ext/dio/dio.c =================================================================== RCS file: /repository/php-src/ext/dio/dio.c,v retrieving revision 1.21.2.3 diff -u -r1.21.2.3 dio.c --- php-src/ext/dio/dio.c 7 Mar 2003 13:42:11 -0000 1.21.2.3 +++ php-src/ext/dio/dio.c 29 Oct 2003 15:57:07 -0000 @@ -27,6 +27,7 @@
#include <sys/stat.h> #include <sys/types.h> +#include <sys/ioctl.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> @@ -44,6 +45,8 @@ PHP_FE(dio_write, NULL) PHP_FE(dio_close, NULL) PHP_FE(dio_tcsetattr, NULL) + PHP_FE(dio_modemget, NULL) + PHP_FE(dio_read_waiting, NULL) {NULL, NULL, NULL} };
@@ -54,7 +57,7 @@
dio_functions,
PHP_MINIT(dio),
NULL,
- NULL,
+ NULL,
NULL,
PHP_MINFO(dio),
"0.1",
@@ -422,8 +425,8 @@
zval *arg = NULL;
php_fd_t *f;
struct termios newtio;
- int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0;
- long BAUD,DATABITS,STOPBITS,PARITYON,PARITY;
+ int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0, Swflow=0, Hwflow=1;
+ long BAUD,DATABITS,STOPBITS,PARITYON,PARITY,SWFLOW,HWFLOW;
HashTable *fh;
zval **element;
@@ -464,6 +467,18 @@
Parity = Z_LVAL_PP(element);
}
+ if (zend_hash_find(fh, "hwflow", sizeof("hwflow"), (void **) &element) == FAILURE) {
+ Hwflow = 0;
+ } else {
+ Hwflow = Z_LVAL_PP(element);
+ }
+
+ if (zend_hash_find(fh, "swflow", sizeof("swflow"), (void **) &element) == FAILURE) {
+ Swflow = 0;
+ } else {
+ Swflow = Z_LVAL_PP(element);
+ }
+
/* assign to correct values... */
switch (Baud_Rate) {
case 38400: @@ -561,9 +576,14 @@
zend_error(E_WARNING, "invalid parity %d", Parity);
RETURN_FALSE;
} - - newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
- newtio.c_iflag = IGNPAR;
+
+ HWFLOW = (Hwflow == 0) ? 0 : CRTSCTS;
+
+ SWFLOW = (Swflow == 0) ? 0 : (IXON | IXOFF | IXANY);
+
+
+ newtio.c_cflag = BAUD | HWFLOW | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+ newtio.c_iflag = IGNPAR | SWFLOW;
newtio.c_oflag = 0;
newtio.c_lflag = 0; /* ICANON; */
newtio.c_cc[VMIN]=1;
@@ -592,6 +612,60 @@
zend_list_delete(Z_LVAL_P(r_fd));
}
/* }}} */
+
+
+/* {{{ proto array dio_modemget(resource fd)
+ Get modem bit status for the file descriptor fd */
+PHP_FUNCTION(dio_modemget)
+{
+ zval *r_fd;
+ php_fd_t *f;
+ int status;
+
+ 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);
+
+ if (ioctl(f->fd, TIOCMGET, &status) == -1) {
+ php_error(E_WARNING, "%s(): cannot ioctl(TIOCMGET) %d: %s",
+ get_active_function_name(TSRMLS_C), f->fd, strerror(errno));
+ RETURN_FALSE;
+ }
+
+ array_init(return_value);
+ ADD_FIELD("dsr", (TIOCM_DSR & status) == TIOCM_DSR);
+ ADD_FIELD("cts", (TIOCM_CTS & status) == TIOCM_CTS);
+ ADD_FIELD("dcd", (TIOCM_CAR & status) == TIOCM_CAR);
+ ADD_FIELD("ri", (TIOCM_RNG & status) == TIOCM_RNG);
+ ADD_FIELD("rts", (TIOCM_RTS & status) == TIOCM_RTS);
+ ADD_FIELD("dtr", (TIOCM_DTR & status) == TIOCM_DTR);
+}
+/* }}} */
+
+
+/* {{{ proto array dio_read_waiting(resource fd)
+ * Get number of bytes waiting to be read from file descriptor fd */
+PHP_FUNCTION(dio_read_waiting)
+{
+ zval *r_fd;
+ php_fd_t *f;
+ int bytes;
+
+ 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);
+
+ if (ioctl(f->fd, TIOCINQ, &bytes) != 0) {
+ php_error(E_WARNING, "%s(): cannot ioctl(TIOCINQ) %d: %s",
+ get_active_function_name(TSRMLS_C), f->fd, strerror(errno));
+ RETURN_FALSE;
+ }
+
+ RETURN_LONG(bytes);
+}
+/* }}} */
/* * Local variables: Index: php-src/ext/dio/php_dio.h =================================================================== RCS file: /repository/php-src/ext/dio/php_dio.h,v retrieving revision 1.4.4.1 diff -u -r1.4.4.1 php_dio.h --- php-src/ext/dio/php_dio.h 31 Dec 2002 16:34:25 -0000 1.4.4.1 +++ php-src/ext/dio/php_dio.h 29 Oct 2003 15:57:07 -0000 @@ -45,6 +45,8 @@ PHP_FUNCTION(dio_fcntl); PHP_FUNCTION(dio_close); PHP_FUNCTION(dio_tcsetattr); +PHP_FUNCTION(dio_modemget); +PHP_FUNCTION(dio_read_waiting);
typedef struct {
int fd;
------------------------------------------------------------------------
Index: php-src/ext/dio/dio.c =================================================================== RCS file: /repository/php-src/ext/dio/dio.c,v retrieving revision 1.21.2.3 diff -u -r1.21.2.3 dio.c --- php-src/ext/dio/dio.c 7 Mar 2003 13:42:11 -0000 1.21.2.3 +++ php-src/ext/dio/dio.c 29 Oct 2003 16:06:58 -0000 @@ -27,6 +27,7 @@
#include <sys/stat.h>
#include <sys/types.h>
+#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
@@ -54,7 +55,7 @@
dio_functions,
PHP_MINIT(dio),
NULL,
- NULL,
+ NULL,
NULL,
PHP_MINFO(dio),
"0.1",
@@ -422,8 +423,8 @@
zval *arg = NULL;
php_fd_t *f;
struct termios newtio;
- int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0;
- long BAUD,DATABITS,STOPBITS,PARITYON,PARITY;
+ int Baud_Rate, Data_Bits=8, Stop_Bits=1, Parity=0, Swflow=0, Hwflow=1;
+ long BAUD,DATABITS,STOPBITS,PARITYON,PARITY,SWFLOW,HWFLOW;
HashTable *fh;
zval **element;
@@ -464,6 +465,18 @@
Parity = Z_LVAL_PP(element);
}
+ if (zend_hash_find(fh, "hwflow", sizeof("hwflow"), (void **) &element) == FAILURE) {
+ Hwflow = 0;
+ } else {
+ Hwflow = Z_LVAL_PP(element);
+ }
+
+ if (zend_hash_find(fh, "swflow", sizeof("swflow"), (void **) &element) == FAILURE) {
+ Swflow = 0;
+ } else {
+ Swflow = Z_LVAL_PP(element);
+ }
+
/* assign to correct values... */
switch (Baud_Rate) {
case 38400: @@ -561,9 +574,14 @@
zend_error(E_WARNING, "invalid parity %d", Parity);
RETURN_FALSE;
} - - newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
- newtio.c_iflag = IGNPAR;
+
+ HWFLOW = (Hwflow == 0) ? 0 : CRTSCTS;
+
+ SWFLOW = (Swflow == 0) ? 0 : (IXON | IXOFF | IXANY);
+
+
+ newtio.c_cflag = BAUD | HWFLOW | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
+ newtio.c_iflag = IGNPAR | SWFLOW;
newtio.c_oflag = 0;
newtio.c_lflag = 0; /* ICANON; */
newtio.c_cc[VMIN]=1;
@@ -592,6 +610,8 @@
zend_list_delete(Z_LVAL_P(r_fd));
}
/* }}} */
+
+
/* * Local variables:
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php