php-src/ext/yp/yp.c
Andrey Hristov 5fcc682ebc proto fixes
2003-07-19 19:23:34 +00:00

431 lines
11 KiB
C

/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2003 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_0.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. |
+----------------------------------------------------------------------+
| Authors: Stephanie Wehner <_@r4k.net> |
| Fredrik Ohrn |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "ext/standard/info.h"
#if HAVE_YP
#include "php_yp.h"
#include <rpcsvc/ypclnt.h>
/* {{{ thread safety stuff */
#ifdef ZTS
int yp_globals_id;
#else
PHP_YP_API php_yp_globals yp_globals;
#endif
/* }}} */
function_entry yp_functions[] = {
PHP_FE(yp_get_default_domain, NULL)
PHP_FE(yp_order, NULL)
PHP_FE(yp_master, NULL)
PHP_FE(yp_match, NULL)
PHP_FE(yp_first, NULL)
PHP_FE(yp_next, NULL)
PHP_FE(yp_all, NULL)
PHP_FE(yp_cat, NULL)
PHP_FE(yp_errno, NULL)
PHP_FE(yp_err_string, NULL)
{NULL, NULL, NULL}
};
zend_module_entry yp_module_entry = {
STANDARD_MODULE_HEADER,
"yp",
yp_functions,
PHP_MINIT(yp),
NULL,
PHP_RINIT(yp),
NULL,
PHP_MINFO(yp),
NO_VERSION_YET,
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_YP
ZEND_GET_MODULE(yp)
#endif
/* {{{ proto string yp_get_default_domain(void)
Returns the domain or false */
PHP_FUNCTION(yp_get_default_domain)
{
char *outdomain;
if((YP(error) = yp_get_default_domain(&outdomain))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
RETVAL_STRING(outdomain,1);
}
/* }}} */
/* {{{ proto int yp_order(string domain, string map)
Returns the order number or false */
PHP_FUNCTION(yp_order)
{
pval **domain, **map;
#if SOLARIS_YP
unsigned long outval;
#else
int outval;
#endif
if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
if((YP(error) = yp_order(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outval))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
RETVAL_LONG(outval);
}
/* }}} */
/* {{{ proto string yp_master(string domain, string map)
Returns the machine name of the master */
PHP_FUNCTION(yp_master)
{
pval **domain, **map;
char *outname;
if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
if((YP(error) = yp_master(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outname))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
RETVAL_STRING(outname,1);
}
/* }}} */
/* {{{ proto string yp_match(string domain, string map, string key)
Returns the matched line or false */
PHP_FUNCTION(yp_match)
{
pval **domain, **map, **key;
char *outval;
int outvallen;
if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&key) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
convert_to_string_ex(key);
if((YP(error) = yp_match(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), Z_STRVAL_PP (key), Z_STRLEN_PP (key), &outval, &outvallen))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
RETVAL_STRINGL(outval,outvallen,1);
}
/* }}} */
/* {{{ proto array yp_first(string domain, string map)
Returns the first key as array with $var[$key] and the the line as the value */
PHP_FUNCTION(yp_first)
{
pval **domain, **map;
char *outval, *outkey;
int outvallen, outkeylen;
if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
if((YP(error) = yp_first(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), &outkey, &outkeylen, &outval, &outvallen))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
array_init(return_value);
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);
/* Deprecated */
add_assoc_stringl(return_value,"key",outkey,outkeylen,1);
add_assoc_stringl(return_value,"value",outval,outvallen,1);
}
/* }}} */
/* {{{ proto array yp_next(string domain, string map, string key)
Returns an array with $var[$key] and the the line as the value */
PHP_FUNCTION(yp_next)
{
pval **domain, **map, **key;
char *outval, *outkey;
int outvallen, outkeylen;
if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&key) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
convert_to_string_ex(key);
if((YP(error) = yp_next(Z_STRVAL_PP (domain), Z_STRVAL_PP (map), Z_STRVAL_PP (key), Z_STRLEN_PP (key), &outkey, &outkeylen, &outval, &outvallen))) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (YP(error)));
RETURN_FALSE;
}
array_init(return_value);
add_assoc_stringl_ex(return_value,outkey,outkeylen,outval,outvallen,1);
}
/* }}} */
/* {{{ php_foreach_all
*/
static int php_foreach_all (int instatus, char *inkey, int inkeylen, char *inval, int invallen, char *indata)
{
int r;
zval *status, *key, *value;
zval **args [3];
zval *retval;
TSRMLS_FETCH();
args[0] = &status;
args[1] = &key;
args[2] = &value;
MAKE_STD_ZVAL (status);
ZVAL_LONG (status, ypprot_err (instatus));
MAKE_STD_ZVAL (key);
ZVAL_STRINGL (key, inkey, inkeylen, 1);
MAKE_STD_ZVAL (value);
ZVAL_STRINGL (value, inval, invallen, 1);
if(call_user_function_ex(CG(function_table), NULL, *((zval **)indata), &retval, 3, args, 0, NULL TSRMLS_CC) != SUCCESS)
{
zval_ptr_dtor(&status);
zval_ptr_dtor(&key);
zval_ptr_dtor(&value);
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Function call failed");
return 1;
}
convert_to_long_ex(&retval);
r = Z_LVAL_P (retval);
zval_ptr_dtor(&retval);
zval_ptr_dtor(&status);
zval_ptr_dtor(&key);
zval_ptr_dtor(&value);
return r;
}
/* }}} */
/* {{{ proto bool yp_all(string domain, string map, string callback)
Traverse the map and call a function on each entry */
PHP_FUNCTION(yp_all)
{
pval **domain, **map, **php_callback;
struct ypall_callback callback;
if((ZEND_NUM_ARGS() != 3) || zend_get_parameters_ex(3,&domain,&map,&php_callback) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
callback.foreach = php_foreach_all;
callback.data = (char *) php_callback;
yp_all(Z_STRVAL_PP(domain),Z_STRVAL_PP(map),&callback);
RETURN_FALSE;
}
/* }}} */
/* {{{ php_foreach_cat
*/
static int php_foreach_cat (int instatus, char *inkey, int inkeylen, char *inval, int invallen, char *indata)
{
int err;
err = ypprot_err (instatus);
if (!err)
{
if (inkeylen) {
char *key = emalloc(inkeylen+1);
if(key) {
strlcpy(key, inkey, inkeylen+1);
add_assoc_stringl_ex((zval *) indata, key, inkeylen+1, inval, invallen, 1);
efree(key);
} else {
php_error(E_WARNING, "Can't allocate %d bytes for key buffer in yp_cat()");
}
}
return 0;
}
if (err != YPERR_NOMORE)
{
TSRMLS_FETCH();
YP(error) = err;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", yperr_string (err));
}
return 0;
}
/* }}} */
/* {{{ proto array yp_cat(string domain, string map)
Return an array containing the entire map */
PHP_FUNCTION(yp_cat)
{
pval **domain, **map;
struct ypall_callback callback;
if((ZEND_NUM_ARGS() != 2) || zend_get_parameters_ex(2,&domain,&map) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(domain);
convert_to_string_ex(map);
array_init(return_value);
callback.foreach = php_foreach_cat;
callback.data = (char *) return_value;
yp_all(Z_STRVAL_PP(domain),Z_STRVAL_PP(map),&callback);
}
/* }}} */
/* {{{ proto int yp_errno()
Returns the error code from the last call or 0 if no error occured */
PHP_FUNCTION(yp_errno)
{
if((ZEND_NUM_ARGS() != 0)) {
WRONG_PARAM_COUNT;
}
RETURN_LONG (YP(error));
}
/* }}} */
/* {{{ proto string yp_err_string(int errorcode)
Returns the corresponding error string for the given error code */
PHP_FUNCTION(yp_err_string)
{
pval **error;
char *string;
if((ZEND_NUM_ARGS() != 1) || zend_get_parameters_ex(1,&error) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long_ex(error);
if((string = yperr_string(Z_LVAL_PP(error))) == NULL) {
RETURN_FALSE;
}
RETVAL_STRING(string,1);
}
/* }}} */
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(yp)
{
#ifdef ZTS
ts_allocate_id(&yp_globals_id, sizeof(php_yp_globals), NULL, NULL);
#endif
REGISTER_LONG_CONSTANT("YPERR_BADARGS", YPERR_BADARGS, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_BADDB", YPERR_BADDB, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_BUSY", YPERR_BUSY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_DOMAIN", YPERR_DOMAIN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_KEY", YPERR_KEY, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_MAP", YPERR_MAP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_NODOM", YPERR_NODOM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_NOMORE", YPERR_NOMORE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_PMAP", YPERR_PMAP, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_RESRC", YPERR_RESRC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_RPC", YPERR_RPC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_YPBIND", YPERR_YPBIND, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_YPERR", YPERR_YPERR, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_YPSERV", YPERR_YPSERV, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("YPERR_VERS", YPERR_VERS, CONST_CS | CONST_PERSISTENT);
return SUCCESS;
}
/* }}} */
PHP_RINIT_FUNCTION(yp)
{
YP(error) = 0;
return SUCCESS;
}
PHP_MINFO_FUNCTION(yp)
{
php_info_print_table_start();
php_info_print_table_row(2, "YP Support", "enabled");
php_info_print_table_end();
}
#endif /* HAVE_YP */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/