Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'redis_commands.c')
-rw-r--r--redis_commands.c95
1 files changed, 78 insertions, 17 deletions
diff --git a/redis_commands.c b/redis_commands.c
index 187a2cdf..47faaebd 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -2100,6 +2100,84 @@ redis_pop_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
return SUCCESS;
}
+int
+redis_acl_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ char **cmd, int *cmd_len, short *slot, void **ctx)
+{
+ smart_string cmdstr = {0};
+ zend_string *op, *zstr;
+ zval *z_args = NULL;
+ int argc = 0, i;
+
+ ZEND_PARSE_PARAMETERS_START(1, -1)
+ Z_PARAM_STR(op)
+ Z_PARAM_OPTIONAL
+ Z_PARAM_VARIADIC('*', z_args, argc)
+ ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
+
+ if (zend_string_equals_literal_ci(op, "CAT") ||
+ zend_string_equals_literal_ci(op, "LIST") ||
+ zend_string_equals_literal_ci(op, "USERS")
+ ) {
+ *ctx = NULL;
+ } else if (zend_string_equals_literal_ci(op, "LOAD") ||
+ zend_string_equals_literal_ci(op, "SAVE")
+ ) {
+ *ctx = PHPREDIS_CTX_PTR;
+ } else if (zend_string_equals_literal_ci(op, "GENPASS") ||
+ zend_string_equals_literal_ci(op, "WHOAMI")
+ ) {
+ *ctx = PHPREDIS_CTX_PTR + 1;
+ } else if (zend_string_equals_literal_ci(op, "SETUSER")) {
+ if (argc < 1) {
+ php_error_docref(NULL, E_WARNING, "ACL SETUSER requires at least one argument");
+ return FAILURE;
+ }
+ *ctx = PHPREDIS_CTX_PTR;
+ } else if (zend_string_equals_literal_ci(op, "DELUSER")) {
+ if (argc < 1) {
+ php_error_docref(NULL, E_WARNING, "ACL DELUSER requires at least one argument");
+ return FAILURE;
+ }
+ *ctx = PHPREDIS_CTX_PTR + 2;
+ } else if (zend_string_equals_literal_ci(op, "GETUSER")) {
+ if (argc < 1) {
+ php_error_docref(NULL, E_WARNING, "ACL GETUSER requires at least one argument");
+ return FAILURE;
+ }
+ *ctx = PHPREDIS_CTX_PTR + 3;
+ } else if (zend_string_equals_literal_ci(op, "DRYRUN")) {
+ if (argc < 2) {
+ php_error_docref(NULL, E_WARNING, "ACL DRYRUN requires at least two arguments");
+ return FAILURE;
+ }
+ *ctx = PHPREDIS_CTX_PTR;
+ } else if (zend_string_equals_literal_ci(op, "LOG")) {
+ if (argc > 0 && Z_TYPE(z_args[0]) == IS_STRING && ZVAL_STRICMP_STATIC(&z_args[0], "RESET")) {
+ *ctx = PHPREDIS_CTX_PTR;
+ } else {
+ *ctx = PHPREDIS_CTX_PTR + 4;
+ }
+ } else {
+ php_error_docref(NULL, E_WARNING, "Unknown ACL operation '%s'", ZSTR_VAL(op));
+ return FAILURE;
+ }
+
+ REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, 1 + argc, "ACL");
+ redis_cmd_append_sstr_zstr(&cmdstr, op);
+
+ for (i = 0; i < argc; ++i) {
+ zstr = zval_get_string(&z_args[i]);
+ redis_cmd_append_sstr_zstr(&cmdstr, zstr);
+ zend_string_release(zstr);
+ }
+
+ *cmd = cmdstr.c;
+ *cmd_len = cmdstr.len;
+
+ return SUCCESS;
+}
+
/* Attempt to pull a long expiry from a zval. We're more restrictave than zval_get_long
* because that function will return integers from things like open file descriptors
* which should simply fail as a TTL */
@@ -3168,23 +3246,6 @@ int redis_pfcount_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
return SUCCESS;
}
-char *redis_variadic_str_cmd(char *kw, zval *argv, int argc, int *cmd_len) {
- smart_string cmdstr = {0};
- zend_string *zstr;
- int i;
-
- redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
-
- for (i = 0; i < argc; i++) {
- zstr = zval_get_string(&argv[i]);
- redis_cmd_append_sstr_zstr(&cmdstr, zstr);
- zend_string_release(zstr);
- }
-
- *cmd_len = cmdstr.len;
- return cmdstr.c;
-}
-
int redis_auth_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx)
{