diff --git a/bindings/php/config.m4 b/bindings/php/config.m4 new file mode 100644 index 00000000..6f3e6b57 --- /dev/null +++ b/bindings/php/config.m4 @@ -0,0 +1,15 @@ +PHP_ARG_ENABLE(sigar, whether to enable Sigar support, +[ --enable-sigar Enable Sigar support]) + +if test "$PHP_SIGAR" = "yes"; then + AC_DEFINE(HAVE_SIGAR, 1, [Whether you have Sigar]) + dnl hardwired for the moment + SIGAR_LIBNAME=sigar-universal-macosx + SIGAR_INSTALLDIR=../java/sigar-bin + SIGAR_LIB_DIR=$SIGAR_INSTALLDIR/lib + SIGAR_INC_DIR=$SIGAR_INSTALLDIR/include + PHP_ADD_LIBRARY_WITH_PATH($SIGAR_LIBNAME, $SIGAR_LIB_DIR, SIGAR_SHARED_LIBADD) + PHP_ADD_INCLUDE($SIGAR_INC_DIR) + PHP_NEW_EXTENSION(sigar, php_sigar.c, $ext_shared) + PHP_SUBST(SIGAR_SHARED_LIBADD) +fi diff --git a/bindings/php/php_sigar.c b/bindings/php/php_sigar.c new file mode 100644 index 00000000..70bd410a --- /dev/null +++ b/bindings/php/php_sigar.c @@ -0,0 +1,165 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_sigar.h" +#include "sigar.h" +#include "sigar_fileinfo.h" +#include "sigar_format.h" + +#define PHP_SIGAR_RETURN_STRING(s) \ + RETURN_STRING(s, 1) + +static char *php_sigar_net_address_to_string(sigar_net_address_t address) +{ + char addr_str[SIGAR_INET6_ADDRSTRLEN]; + sigar_net_address_to_string(NULL, &address, addr_str); + return estrdup(addr_str); +} + +#define PHP_SIGAR_RETURN_NETADDR(a) \ + RETURN_STRING(php_sigar_net_address_to_string(a), 0) + +#define zSIGAR_PARSE_PID \ + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &pid) + +#define zSIGAR_PARSE_NAME \ + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) + +#define zSIGAR_OBJ \ + (((php_sigar_obj_t *)zend_object_store_get_object(getThis() TSRMLS_CC))->ptr) + +#define zSIGAR \ + sigar_t *sigar = (sigar_t *)zSIGAR_OBJ + +typedef struct { + zend_object std; + void *ptr; +} php_sigar_obj_t; + +static void php_sigar_obj_dtor(void *object TSRMLS_DC) +{ + php_sigar_obj_t *intern = (php_sigar_obj_t *)object; + + zend_object_std_dtor(&intern->std TSRMLS_CC); + if (intern->ptr) { + efree(intern->ptr); + } + efree(intern); +} + +static zend_object_value php_sigar_ctor(zend_objects_free_object_storage_t dtor, + zend_object_handlers *handlers, + php_sigar_obj_t **obj, + zend_class_entry *class_type) +{ + php_sigar_obj_t *intern = emalloc(sizeof(*intern)); + zend_object_value retval; + + memset(intern, 0, sizeof(*intern)); + if (obj) { + *obj = intern; + } + + zend_object_std_init(&intern->std, class_type TSRMLS_CC); + + retval.handle = zend_objects_store_put(intern, + NULL, + dtor, + NULL TSRMLS_CC); + + retval.handlers = handlers; + + return retval; +} + +static void php_sigar_close(void *object TSRMLS_DC) +{ + php_sigar_obj_t *intern = (php_sigar_obj_t *)object; + + if (!intern) { + return; + } + + if (intern->ptr) { + sigar_close((sigar_t *)intern->ptr); + intern->ptr = NULL; + } + + php_sigar_obj_dtor(object); +} + +static zend_object_handlers php_sigar_object_handlers; + +static zend_object_value php_sigar_new(zend_class_entry *class_type TSRMLS_DC) +{ + php_sigar_obj_t *intern; + + zend_object_value retval = + php_sigar_ctor(php_sigar_close, + &php_sigar_object_handlers, + &intern, + class_type); + + sigar_open(&((sigar_t *)intern->ptr)); + + return retval; +} + +static php_sigar_obj_t *php_sigar_obj_new(char *name, zval *object TSRMLS_DC) +{ + zend_class_entry **ce; + zend_lookup_class(name, strlen(name), &ce TSRMLS_CC); + Z_TYPE_P(object) = IS_OBJECT; + object_init_ex(object, *ce); + object->refcount = 1; + object->is_ref = 0; + return (php_sigar_obj_t *)zend_object_store_get_object(object TSRMLS_CC); +} + +#define PHP_SIGAR_INIT_HANDLERS(handlers) \ + memcpy(&handlers, zend_get_std_object_handlers(), sizeof(handlers)); \ + handlers.clone_obj = NULL + +#include "php_sigar_generated.c" + +static zend_function_entry php_sigar_class_functions[] = { + PHP_SIGAR_FUNCTIONS + {NULL, NULL, NULL} +}; + +static PHP_MINIT_FUNCTION(sigar) +{ + zend_class_entry ce; + + PHP_SIGAR_INIT_HANDLERS(php_sigar_object_handlers); + INIT_CLASS_ENTRY(ce, "Sigar", php_sigar_class_functions); + ce.create_object = php_sigar_new; + zend_register_internal_class(&ce TSRMLS_CC); + + PHP_SIGAR_INIT; + + return SUCCESS; +} + +zend_function_entry php_sigar_functions[] = { + {NULL, NULL, NULL} +}; + +zend_module_entry sigar_module_entry = { + STANDARD_MODULE_HEADER, + "sigar", + php_sigar_functions, + PHP_MINIT(sigar), + NULL, + NULL, + NULL, + NULL, + "0.1", + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_SIGAR +ZEND_GET_MODULE(sigar) +#endif diff --git a/bindings/php/php_sigar.h b/bindings/php/php_sigar.h new file mode 100644 index 00000000..dd56da93 --- /dev/null +++ b/bindings/php/php_sigar.h @@ -0,0 +1,6 @@ +#ifndef PHP_SIGAR_H +#define PHP_SIGAR_H 1 + +extern zend_module_entry sigar_module_entry; + +#endif