Does an ioctl(TIOCMGET) to get the status of the modem control lines.
array dio_modemget(fd descriptor)
Returns an array with elements "dsr", "cts", etc equal to 1 or 0. Example output:
array(6) {
["dsr"]=>
int(0)
["cts"]=>
int(0)
["dcd"]=>
int(0)
["ri"]=>
int(0)
["rts"]=>
int(1)
["dtr"]=>
int(1)
}
I wrote this for a script that checks the status of a UPS (which is provided on the serial control lines). A test script is also attached.
Btw, this is my first attempt at both working on PHP itself, and submitting a patch. If anything here is wrong, let me know! :p
ttyl, greg -- Greg MacLellan
? autom4te-2.53.cache
? dio_modemget.patch
? dio_modemget.patch.2
Index: 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
--- ext/dio/dio.c 7 Mar 2003 13:42:11 -0000 1.21.2.3
+++ ext/dio/dio.c 15 Sep 2003 22:56: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,7 @@
PHP_FE(dio_write, NULL)
PHP_FE(dio_close, NULL)
PHP_FE(dio_tcsetattr, NULL)
+ PHP_FE(dio_modemget, NULL)
{NULL, NULL, NULL}
};
@@ -54,7 +56,7 @@
dio_functions,
PHP_MINIT(dio),
NULL,
- NULL,
+ NULL,
NULL,
PHP_MINFO(dio),
"0.1",
@@ -592,6 +594,37 @@
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);
+}
+/* }}} */
+
/*
* Local variables:
Index: 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
--- ext/dio/php_dio.h 31 Dec 2002 16:34:25 -0000 1.4.4.1
+++ ext/dio/php_dio.h 15 Sep 2003 22:56:07 -0000
@@ -45,6 +45,7 @@
PHP_FUNCTION(dio_fcntl);
PHP_FUNCTION(dio_close);
PHP_FUNCTION(dio_tcsetattr);
+PHP_FUNCTION(dio_modemget);
typedef struct {
int fd;#!/usr/bin/php
<?php
$fd = dio_open("/dev/ttyS0", O_RDONLY);
$status = dio_modemget($fd);
dio_close($fd);
var_dump($status);
?>
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
