summaryrefslogtreecommitdiff
path: root/ext/dio/dio.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dio/dio.c')
-rw-r--r--ext/dio/dio.c595
1 files changed, 0 insertions, 595 deletions
diff --git a/ext/dio/dio.c b/ext/dio/dio.c
deleted file mode 100644
index 5c5282626c..0000000000
--- a/ext/dio/dio.c
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 4 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2003 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 2.02 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available at through the world-wide-web at |
- | http://www.php.net/license/2_02.txt. |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Sterling Hughes <sterling@php.net> |
- +----------------------------------------------------------------------+
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "php.h"
-#include "php_ini.h"
-#include "ext/standard/info.h"
-#include "php_dio.h"
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <termios.h>
-
-#define le_fd_name "Direct I/O File Descriptor"
-static int le_fd;
-
-function_entry dio_functions[] = {
- PHP_FE(dio_open, NULL)
- PHP_FE(dio_truncate, NULL)
- PHP_FE(dio_stat, NULL)
- PHP_FE(dio_seek, NULL)
- PHP_FE(dio_fcntl, NULL)
- PHP_FE(dio_read, NULL)
- PHP_FE(dio_write, NULL)
- PHP_FE(dio_close, NULL)
- PHP_FE(dio_tcsetattr, NULL)
- {NULL, NULL, NULL}
-};
-
-
-zend_module_entry dio_module_entry = {
- STANDARD_MODULE_HEADER,
- "dio",
- dio_functions,
- PHP_MINIT(dio),
- NULL,
- NULL,
- NULL,
- PHP_MINFO(dio),
- "0.1",
- STANDARD_MODULE_PROPERTIES
-};
-
-
-#ifdef COMPILE_DL_DIO
-ZEND_GET_MODULE(dio)
-#endif
-
-
-static void _dio_close_fd(zend_rsrc_list_entry *rsrc TSRMLS_DC)
-{
- php_fd_t *f = (php_fd_t *) rsrc->ptr;
- close(f->fd);
- free(f);
-}
-
-#define RDIOC(c) REGISTER_LONG_CONSTANT(#c, c, CONST_CS | CONST_PERSISTENT)
-
-#define DIO_UNDEF_CONST -1
-
-PHP_MINIT_FUNCTION(dio)
-{
- le_fd = zend_register_list_destructors_ex(_dio_close_fd, NULL, le_fd_name, module_number);
-
- RDIOC(O_RDONLY);
- RDIOC(O_WRONLY);
- RDIOC(O_RDWR);
- RDIOC(O_CREAT);
- RDIOC(O_EXCL);
- RDIOC(O_TRUNC);
- RDIOC(O_APPEND);
- RDIOC(O_NONBLOCK);
- RDIOC(O_NDELAY);
-#ifdef O_SYNC
- RDIOC(O_SYNC);
-#endif
-#ifdef O_ASYNC
- RDIOC(O_ASYNC);
-#endif
- RDIOC(O_NOCTTY);
- RDIOC(S_IRWXU);
- RDIOC(S_IRUSR);
- RDIOC(S_IWUSR);
- RDIOC(S_IXUSR);
- RDIOC(S_IRWXG);
- RDIOC(S_IRGRP);
- RDIOC(S_IWGRP);
- RDIOC(S_IXGRP);
- RDIOC(S_IRWXO);
- RDIOC(S_IROTH);
- RDIOC(S_IWOTH);
- RDIOC(S_IXOTH);
- RDIOC(F_DUPFD);
- RDIOC(F_GETFD);
- RDIOC(F_GETFL);
- RDIOC(F_SETFL);
- RDIOC(F_GETLK);
- RDIOC(F_SETLK);
- RDIOC(F_SETLKW);
- RDIOC(F_SETOWN);
- RDIOC(F_GETOWN);
- RDIOC(F_UNLCK);
- RDIOC(F_RDLCK);
- RDIOC(F_WRLCK);
-
- return SUCCESS;
-}
-
-PHP_MINFO_FUNCTION(dio)
-{
- php_info_print_table_start();
- php_info_print_table_row(2, "dio support", "enabled");
- php_info_print_table_end();
-}
-
-static void new_php_fd(php_fd_t **f, int fd)
-{
- *f = malloc(sizeof(php_fd_t));
- (*f)->fd = fd;
-}
-
-/* {{{ proto resource dio_open(string filename, int flags[, int mode])
- Open a new filename with specified permissions of flags and creation permissions of mode */
-PHP_FUNCTION(dio_open)
-{
- php_fd_t *f;
- char *file_name;
- int file_name_length;
- int flags;
- mode_t mode = 0;
- int fd;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|l", &file_name, &file_name_length, &flags, &mode) == FAILURE) {
- return;
- }
-
- if (ZEND_NUM_ARGS() == 3) {
- fd = open(file_name, flags, mode);
- } else {
- fd = open(file_name, flags);
- }
-
- if (fd == -1) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot open file %s with flags %d and permissions %d: %s", file_name, flags, mode, strerror(errno));
- RETURN_FALSE;
- }
-
- new_php_fd(&f, fd);
- ZEND_REGISTER_RESOURCE(return_value, f, le_fd);
-}
-/* }}} */
-
-/* {{{ 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)
-{
- zval *r_fd;
- php_fd_t *f;
- char *data;
- int bytes = 1024;
- ssize_t res;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &r_fd, &bytes) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
- data = emalloc(bytes + 1);
- res = read(f->fd, data, bytes);
- if (res <= 0) {
- efree(data);
- RETURN_NULL();
- }
-
- data = erealloc(data, res + 1);
- data[res] = 0;
-
- RETURN_STRINGL(data, res, 0);
-}
-/* }}} */
-
-/* {{{ proto int dio_write(resource fd, string data[, int len])
- Write data to fd with optional truncation at length */
-PHP_FUNCTION(dio_write)
-{
- zval *r_fd;
- php_fd_t *f;
- char *data;
- size_t data_len;
- size_t trunc_len = 0;
- ssize_t res;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &r_fd, &data, &data_len, &trunc_len) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
- 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));
- }
-
- RETURN_LONG(res);
-}
-/* }}} */
-
-/* {{{ proto bool dio_truncate(resource fd, int offset)
- Truncate file descriptor fd to offset bytes */
-PHP_FUNCTION(dio_truncate)
-{
- zval *r_fd;
- php_fd_t *f;
- off_t offset;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &r_fd, &offset) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
- if (ftruncate(f->fd, offset) == -1) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "couldn't truncate %d to %d bytes: %s", f->fd, offset, strerror(errno));
- RETURN_FALSE;
- }
-
- RETURN_TRUE;
-}
-/* }}} */
-
-#define ADD_FIELD(f, v) add_assoc_long_ex(return_value, (f), sizeof(f), v);
-
-/* {{{ proto array dio_stat(resource fd)
- Get stat information about the file descriptor fd */
-PHP_FUNCTION(dio_stat)
-{
- zval *r_fd;
- php_fd_t *f;
- struct stat s;
-
- 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 (fstat(f->fd, &s) == -1) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot stat %d: %s", f->fd, strerror(errno));
- RETURN_FALSE;
- }
-
- array_init(return_value);
- ADD_FIELD("device", s.st_dev);
- ADD_FIELD("inode", s.st_ino);
- ADD_FIELD("mode", s.st_mode);
- ADD_FIELD("nlink", s.st_nlink);
- ADD_FIELD("uid", s.st_uid);
- ADD_FIELD("gid", s.st_gid);
- ADD_FIELD("device_type", s.st_rdev);
- ADD_FIELD("size", s.st_size);
- ADD_FIELD("block_size", s.st_blksize);
- ADD_FIELD("blocks", s.st_blocks);
- ADD_FIELD("atime", s.st_atime);
- ADD_FIELD("mtime", s.st_mtime);
- ADD_FIELD("ctime", s.st_ctime);
-}
-/* }}} */
-
-/* {{{ proto int dio_seek(resource fd, int pos, int whence)
- Seek to pos on fd from whence */
-PHP_FUNCTION(dio_seek)
-{
- zval *r_fd;
- php_fd_t *f;
- off_t offset;
- int whence = SEEK_SET;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|l", &r_fd, &offset, &whence) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
- RETURN_LONG(lseek(f->fd, offset, whence));
-}
-/* }}} */
-
-/* {{{ proto mixed dio_fcntl(resource fd, int cmd[, mixed arg])
- Perform a c library fcntl on fd */
-PHP_FUNCTION(dio_fcntl)
-{
- zval *r_fd;
- zval *arg = NULL;
- php_fd_t *f;
- int cmd;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|z", &r_fd, &cmd, &arg) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
- switch (cmd) {
- case F_SETLK:
- case F_SETLKW: {
- zval **element;
- struct flock lk = {0};
- HashTable *fh;
-
- if (!arg) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "expects argument 3 to be array or int, none given");
- RETURN_FALSE;
- }
- if (Z_TYPE_P(arg) == IS_ARRAY) {
- fh = HASH_OF(arg);
- if (zend_hash_find(fh, "start", sizeof("start"), (void **) &element) == FAILURE) {
- lk.l_start = 0;
- }
- else {
- lk.l_start = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "length", sizeof("length"), (void **) &element) == FAILURE) {
- lk.l_len = 0;
- }
- else {
- lk.l_len = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "whence", sizeof("whence"), (void **) &element) == FAILURE) {
- lk.l_whence = 0;
- }
- else {
- lk.l_whence = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "type", sizeof("type"), (void **) &element) == FAILURE) {
- lk.l_type = 0;
- }
- else {
- lk.l_type = Z_LVAL_PP(element);
- }
- } else if (Z_TYPE_P(arg) == IS_LONG) {
- lk.l_start = 0;
- lk.l_len = 0;
- lk.l_whence = SEEK_SET;
- lk.l_type = Z_LVAL_P(arg);
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "expects argument 3 to be array or int, %s given", zend_zval_type_name(arg));
- RETURN_FALSE;
- }
-
- RETURN_LONG(fcntl(f->fd, cmd, &lk));
- break;
- }
- case F_GETLK: {
- struct flock lk = {0};
-
- fcntl(f->fd, cmd, &lk);
-
- array_init(return_value);
- add_assoc_long(return_value, "type", lk.l_type);
- add_assoc_long(return_value, "whence", lk.l_whence);
- add_assoc_long(return_value, "start", lk.l_start);
- add_assoc_long(return_value, "length", lk.l_len);
- add_assoc_long(return_value, "pid", lk.l_pid);
-
- break;
- }
- case F_DUPFD: {
- php_fd_t *new_f;
-
- if (!arg || Z_TYPE_P(arg) != IS_LONG) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "expects argument 3 to be int");
- RETURN_FALSE;
- }
-
- new_php_fd(&new_f, fcntl(f->fd, cmd, Z_LVAL_P(arg)));
- ZEND_REGISTER_RESOURCE(return_value, new_f, le_fd);
- break;
- }
- default:
- if (!arg || Z_TYPE_P(arg) != IS_LONG) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "expects argument 3 to be int");
- RETURN_FALSE;
- }
-
- RETURN_LONG(fcntl(f->fd, cmd, Z_LVAL_P(arg)));
- }
-}
-/* }}} */
-
-
-/* {{{ proto mixed dio_tcsetattr(resource fd, array args )
- Perform a c library tcsetattr on fd */
-PHP_FUNCTION(dio_tcsetattr)
-{
- zval *r_fd;
- 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;
- HashTable *fh;
- zval **element;
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &r_fd, &arg) == FAILURE) {
- return;
- }
- ZEND_FETCH_RESOURCE(f, php_fd_t *, &r_fd, -1, le_fd_name, le_fd);
-
-
- if (Z_TYPE_P(arg) != IS_ARRAY) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"tcsetattr, third argument should be an associative array");
- return;
- }
-
- fh = HASH_OF(arg);
-
- if (zend_hash_find(fh, "baud", sizeof("baud"), (void **) &element) == FAILURE) {
- Baud_Rate = 9600;
- } else {
- Baud_Rate = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "bits", sizeof("bits"), (void **) &element) == FAILURE) {
- Data_Bits = 8;
- } else {
- Data_Bits = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "stop", sizeof("stop"), (void **) &element) == FAILURE) {
- Stop_Bits = 1;
- } else {
- Stop_Bits = Z_LVAL_PP(element);
- }
-
- if (zend_hash_find(fh, "parity", sizeof("parity"), (void **) &element) == FAILURE) {
- Parity = 0;
- } else {
- Parity = Z_LVAL_PP(element);
- }
-
- /* assign to correct values... */
- switch (Baud_Rate) {
- case 38400:
- BAUD = B38400;
- break;
- case 19200:
- BAUD = B19200;
- break;
- case 9600:
- BAUD = B9600;
- break;
- case 4800:
- BAUD = B4800;
- break;
- case 2400:
- BAUD = B2400;
- break;
- case 1800:
- BAUD = B1800;
- break;
- case 1200:
- BAUD = B1200;
- break;
- case 600:
- BAUD = B600;
- break;
- case 300:
- BAUD = B300;
- break;
- case 200:
- BAUD = B200;
- break;
- case 150:
- BAUD = B150;
- break;
- case 134:
- BAUD = B134;
- break;
- case 110:
- BAUD = B110;
- break;
- case 75:
- BAUD = B75;
- break;
- case 50:
- BAUD = B50;
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid baud rate %d", Baud_Rate);
- RETURN_FALSE;
- }
- switch (Data_Bits) {
- case 8:
- DATABITS = CS8;
- break;
- case 7:
- DATABITS = CS7;
- break;
- case 6:
- DATABITS = CS6;
- break;
- case 5:
- DATABITS = CS5;
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid data bits %d", Data_Bits);
- RETURN_FALSE;
- }
- switch (Stop_Bits) {
- case 1:
- STOPBITS = 0;
- break;
- case 2:
- STOPBITS = CSTOPB;
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid stop bits %d", Stop_Bits);
- RETURN_FALSE;
- }
-
- switch (Parity) {
- case 0:
- PARITYON = 0;
- PARITY = 0;
- break;
- case 1:
- PARITYON = PARENB;
- PARITY = PARODD;
- break;
- case 2:
- PARITYON = PARENB;
- PARITY = 0;
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid parity %d", Parity);
- RETURN_FALSE;
- }
-
- newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
- newtio.c_iflag = IGNPAR;
- newtio.c_oflag = 0;
- newtio.c_lflag = 0; /* ICANON; */
- newtio.c_cc[VMIN]=1;
- newtio.c_cc[VTIME]=0;
- tcflush(f->fd, TCIFLUSH);
- tcsetattr(f->fd,TCSANOW,&newtio);
-
- RETURN_TRUE;
-}
-/* }}} */
-
-
-
-/* {{{ proto void dio_close(resource fd)
- Close the file descriptor given by fd */
-PHP_FUNCTION(dio_close)
-{
- zval *r_fd;
- php_fd_t *f;
-
- 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);
-
- zend_list_delete(Z_LVAL_P(r_fd));
-}
-/* }}} */
-
-/*
- * Local variables:
- * c-basic-offset: 4
- * tab-width: 4
- * End:
- * vim600: fdm=marker
- * vim: sw=4 ts=4 noet
- */