49078127036b2f45a73808f3578eb73f2b3f7302
[php-ancillary.git] / php-ancillary.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include "php.h"
5 #include <ancillary.h>
6
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10  
11 #define PHP_ANCILLARY_VERSION "1.0"
12 #define PHP_ANCILLARY_EXTNAME "ancillary"
13  
14 extern zend_module_entry ancillary_module_entry;
15 #define phpext_ancillary_ptr &ancillary_module_entry
16  
17 // declaration of a custom mop_function()
18 PHP_FUNCTION(ancillary_getstream);
19  
20 // list of custom PHP functions provided by this extension
21 // set {NULL, NULL, NULL} as the last record to mark the end of list
22 static function_entry ancillary_getstream[] = {
23     PHP_FE(ancillary_getstream, NULL)
24     {NULL, NULL, NULL}
25 };
26  
27 // the following code creates an entry for the module and registers it with Zend.
28 zend_module_entry ancillary_module_entry = {
29 #if ZEND_MODULE_API_NO >= 20010901
30     STANDARD_MODULE_HEADER,
31 #endif
32     PHP_ANCILLARY_EXTNAME,
33     ancillary_getstream,
34     NULL, // name of the MINIT function or NULL if not applicable
35     NULL, // name of the MSHUTDOWN function or NULL if not applicable
36     NULL, // name of the RINIT function or NULL if not applicable
37     NULL, // name of the RSHUTDOWN function or NULL if not applicable
38     NULL, // name of the MINFO function or NULL if not applicable
39 #if ZEND_MODULE_API_NO >= 20010901
40     PHP_ANCILLARY_VERSION,
41 #endif
42     STANDARD_MODULE_PROPERTIES
43 };
44  
45 ZEND_GET_MODULE(ancillary)
46  
47 // starting from a unix socket receive a socket from an external process
48 PHP_FUNCTION(ancillary_getstream)
49 {
50     zval *zstream;
51     php_stream *stream;
52     int fd_in, fd_out[2];
53     char *headers;
54
55     if ((headers = calloc(8*1024, 1)) == NULL) {
56         return;
57     }
58
59     if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream))
60         return;
61     
62     php_stream_from_zval(stream, &zstream);
63
64     if (php_stream_cast(stream, PHP_STREAM_AS_FD, (void*)&fd_in, REPORT_ERRORS) == FAILURE) {
65         RETURN_FALSE;
66     }
67
68     if(ancil_recv_fds(fd_in, fd_out, 2) == 0) {
69         RETURN_FALSE;
70     }
71     {
72         char bf[2048];
73
74         sprintf(bf, "zero: [%d]    uno: [%d]\n", fd_out[0], fd_out[1]);
75         write(1, bf, strlen(bf));
76     }
77     {
78         int fh;
79
80         if ((fh = open("/tmp/out_php-anc.txt", O_WRONLY | O_CREAT | O_APPEND)) > -1) {
81             // write(fh, headers, 8*1024);
82             close(fh);
83         }
84     }
85
86     if ((stream = php_stream_fopen_from_fd(fd_out[0], "r+b", NULL)) == NULL) {
87         RETURN_FALSE;
88     }
89
90     php_stream_to_zval(stream, return_value);
91 }
92