diff --git a/mosquitto.c b/mosquitto.c index 6338889..f92a0c2 100644 --- a/mosquitto.c +++ b/mosquitto.c @@ -34,9 +34,8 @@ PHP_METHOD(Mosquitto_Client, __construct) object->client = mosquitto_new(id, clean_session, object); if (!object->client) { - char buf[0x100]; - strerror_r(errno, buf, 0x100); - zend_throw_exception(mosquitto_ce_exception, buf, 1 TSRMLS_CC); + char *message = strerror_wrapper(errno); + zend_throw_exception(mosquitto_ce_exception, message, 1 TSRMLS_CC); } } /* }}} */ @@ -69,7 +68,6 @@ PHP_METHOD(Mosquitto_Client, connect) object->connect_callback_cache = connect_callback_cache; if (connect_callback.object_ptr != NULL) { - php_printf("Adding callback reference\n"); Z_ADDREF_P(connect_callback.object_ptr); } @@ -82,11 +80,10 @@ PHP_METHOD(Mosquitto_Client, connect) } if (retval == MOSQ_ERR_INVAL) { - zend_throw_exception(mosquitto_ce_exception, "Invalid parameters", 0 TSRMLS_CC); + zend_throw_exception(mosquitto_ce_exception, "Invalid parameters", 1 TSRMLS_CC); } else if (retval == MOSQ_ERR_ERRNO) { - char buf[0x100]; - strerror_r(errno, buf, 0x100); - zend_throw_exception(mosquitto_ce_exception, buf, 1 TSRMLS_CC); + char *message = strerror_wrapper(errno); + zend_throw_exception(mosquitto_ce_exception, message, 1 TSRMLS_CC); } } /* }}} */ @@ -111,12 +108,6 @@ PHP_METHOD(Mosquitto_Client, publish) object = (mosquitto_client_object *) zend_object_store_get_object(getThis() TSRMLS_CC); retval = mosquitto_publish(object->client, &mid, topic, payload_len, (void *) payload, qos, retain); - if (retval != MOSQ_ERR_SUCCESS) { - char buf[0x100]; - strerror_r(errno, buf, 0x100); - zend_throw_exception(mosquitto_ce_exception, buf, 1 TSRMLS_CC); - } - char *message = NULL; switch (retval) { case MOSQ_ERR_SUCCESS: @@ -146,7 +137,6 @@ PHP_METHOD(Mosquitto_Client, publish) } zend_throw_exception(mosquitto_ce_exception, message, 0 TSRMLS_CC); - efree(message); } /* }}} */ @@ -198,12 +188,22 @@ PHP_METHOD(Mosquitto_Client, loop) strerror_r(errno, message, 256); } zend_throw_exception(mosquitto_ce_exception, message, 0 TSRMLS_CC); - efree(message); } /* }}} */ /* Internal functions */ +char *strerror_wrapper(int err) +{ + char *buf = ecalloc(256, sizeof(char)); + POSSIBLY_UNUSED char *bbuf = buf; +#ifdef _GNU_SOURCE + bbuf = +#endif + strerror_r(err, buf, 256); + return bbuf; +} + static void mosquitto_client_object_destroy(void *object TSRMLS_DC) { mosquitto_client_object *client = (mosquitto_client_object *) object; @@ -237,7 +237,6 @@ static zend_object_value mosquitto_client_object_new() { PHP_MOSQUITTO_API void php_mosquitto_connect_callback(struct mosquitto *mosq, void *obj, int rc) { - php_printf("Called function\n"); mosquitto_client_object *object = (mosquitto_client_object *) obj; zval *params[1], *retval_ptr = NULL; diff --git a/php_mosquitto.h b/php_mosquitto.h index 6eb1913..cfed8bb 100644 --- a/php_mosquitto.h +++ b/php_mosquitto.h @@ -12,6 +12,12 @@ extern zend_module_entry mosquitto_module_entry; # define PHP_MOSQUITTO_API #endif +#ifdef __GLIBC__ +#define POSSIBLY_UNUSED __attribute__((unused)) +#else +#define POSSIBLY_UNUSED +#endif + #ifdef ZTS #include "TSRM.h" #endif @@ -33,6 +39,8 @@ typedef struct _mosquitto_client_object { PHP_MOSQUITTO_API void php_mosquitto_connect_callback(struct mosquitto *mosq, void *obj, int rc); +char *strerror_wrapper(int err); + PHP_MINIT_FUNCTION(mosquitto); PHP_MSHUTDOWN_FUNCTION(mosquitto); PHP_MINFO_FUNCTION(mosquitto); diff --git a/test.php b/test.php index 6138531..70e288b 100644 --- a/test.php +++ b/test.php @@ -1,6 +1,9 @@ connect("localhost", 1883, 5, function($r) { echo "Got code {$r}\n"; }); +$client->connect("localhost", 1883, 5, 'callback'); $client->loop(); +function callback($r) { + echo "I got code {$r}\n"; +}