Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:5076 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 94014 invoked by uid 1010); 29 Oct 2003 16:38:52 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 93987 invoked from network); 29 Oct 2003 16:38:51 -0000 Received: from unknown (HELO alanathome.ossc.com.hk) (202.81.246.113) by pb1.pair.com with SMTP; 29 Oct 2003 16:38:51 -0000 Received: from [192.168.0.184] (helo=akbkhome.com) by alanathome.ossc.com.hk with esmtp (Exim 4.22) id 1AEtNl-000536-RS; Thu, 30 Oct 2003 00:41:17 +0800 Message-ID: <3F9FED2B.4010908@akbkhome.com> Date: Thu, 30 Oct 2003 00:39:07 +0800 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20030925 Thunderbird/0.3 X-Accept-Language: en-us, en MIME-Version: 1.0 To: greg@gregmaclellan.com CC: internals@lists.php.net References: <3F9FE8E8.6060601@gregmaclellan.com> In-Reply-To: <3F9FE8E8.6060601@gregmaclellan.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [PHP-DEV] [PATCH] DIO: Flow control, Modem info, Read waiting From: alan@akbkhome.com (Alan Knowles) would it not make sense to implement 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 > #include >+#include > #include > #include > #include >@@ -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 > #include >+#include > #include > #include > #include >@@ -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: > > >