static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx) { php_curl *ch = (php_curl *) ctx; php_curl_read *t = ch->handlers->read; int length = -1; ELS_FETCH(); switch (t->method) { case PHP_CURL_DIRECT: length = fread(data, size, nmemb, t->fp); case PHP_CURL_USER: { zval *argv[3]; zval *retval; int length; int error; MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(argv[2]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_RESOURCE(argv[1], t->fd); zend_list_addref(t->fd); ZVAL_LONG(argv[2], size * nmemb); error = call_user_function(EG(function_table), NULL, t->func, retval, 3, argv); if (error == FAILURE) { php_error(E_WARNING, "Cannot call the CURLOPT_READFUNCTION"); break; } memcpy(data, Z_STRVAL_P(retval), Z_STRLEN_P(retval)); length = Z_STRLEN_P(retval); zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&argv[2]); zval_ptr_dtor(&retval); break; } } return length; }
static int php_git2_transport_cb(git_transport **out, git_remote *owner, void *param) { zval *param_owner, *retval_ptr = NULL; php_git2_cb_t *p = (php_git2_cb_t*)param; php_git2_t *_param_owner; long retval = 0; GIT2_TSRMLS_SET(p->tsrm_ls) Z_ADDREF_P(p->payload); MAKE_STD_ZVAL(param_owner); if (php_git2_make_resource(&_param_owner, PHP_GIT2_TYPE_REMOTE, owner, 0 TSRMLS_CC)) { return 0; } ZVAL_RESOURCE(param_owner, GIT2_RVAL_P(_param_owner)); if (php_git2_call_function_v(p->fci, p->fcc TSRMLS_CC, &retval_ptr, 2, ¶m_owner, &p->payload)) { return GIT_EUSER; } /* TODO(chobie): implement this */ retval = Z_LVAL_P(retval_ptr); zval_ptr_dtor(&retval_ptr); return retval; }
static size_t _php_curl_write_header(char *data, size_t size, size_t nmemb, void *ctx) { php_curl *ch = (php_curl *) ctx; zval *func = ch->handlers->write_header; zval *argv[2]; zval *retval; int error; int length; ELS_FETCH(); MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_STRINGL(argv[0], data, size * nmemb, 1); error = call_user_function(EG(function_table), NULL, func, retval, 2, argv); if (error == FAILURE) { php_error(E_WARNING, "Couldn't call the CURLOPT_HEADERFUNCTION"); return -1; } length = Z_LVAL_P(retval); zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&retval); return length; }
static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx) { php_curl *ch = (php_curl *) ctx; php_curl_write *t = ch->handlers->write; size_t length = size * nmemb; ELS_FETCH(); switch (t->method) { case PHP_CURL_STDOUT: PUTS(data); break; case PHP_CURL_FILE: return fwrite(data, size, nmemb, t->fp); case PHP_CURL_RETURN: smart_str_appendl(&t->buf, data, (int) length); break; case PHP_CURL_USER: { zval *argv[2]; zval *retval; int error; ELS_FETCH(); MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(retval); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_STRINGL(argv[1], data, (int) length, 1); error = call_user_function(EG(function_table), NULL, t->func, retval, 2, argv); if (error == FAILURE) { php_error(E_WARNING, "Cannot call the CURLOPT_WRITEFUNCTION"); return -1; } length = Z_LVAL_P(retval); zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&retval); break; } } return length; }
static size_t _php_curl_passwd(void *ctx, char *prompt, char *buf, int buflen) { php_curl *ch = (php_curl *) ctx; zval *func = ch->handlers->passwd; zval *argv[3]; zval *retval; int error; ELS_FETCH(); MAKE_STD_ZVAL(argv[0]); MAKE_STD_ZVAL(argv[1]); MAKE_STD_ZVAL(argv[2]); ZVAL_RESOURCE(argv[0], ch->id); zend_list_addref(ch->id); ZVAL_STRING(argv[1], prompt, 1); ZVAL_LONG(argv[2], buflen); error = call_user_function(EG(function_table), NULL, func, retval, 2, argv); if (error == FAILURE) { php_error(E_WARNING, "Couldn't call the CURLOPT_PASSWDFUNCTION"); return -1; } if (Z_STRLEN_P(retval) > buflen) { php_error(E_WARNING, "Returned password is too long for libcurl to handle"); return -1; } strlcpy(buf, Z_STRVAL_P(retval), buflen); zval_ptr_dtor(&argv[0]); zval_ptr_dtor(&argv[1]); zval_ptr_dtor(&argv[2]); zval_ptr_dtor(&retval); return 0; }
/* {{{ pip_pyobject_to_zobject(PyObject *obj) Convert Python object to a PHP (Zend) object */ zval * pip_pyobject_to_zobject(PyObject *obj) { pval *ret; zval *handle; TSRMLS_FETCH(); /* Create a PHP Python object */ MAKE_STD_ZVAL(ret); object_init_ex(ret, &python_class_entry); ret->is_ref = 1; ret->refcount = 1; /* Assign the current PyObject to the new PHP Python object */ ALLOC_ZVAL(handle); ZVAL_RESOURCE(handle, zend_list_insert(obj, le_pyobject)); zval_copy_ctor(handle); INIT_PZVAL(handle); zend_hash_index_update(Z_OBJPROP_P(ret), 0, &handle, sizeof(zval *), NULL); return ret; }