From 6cfaa16a21780f09f76a7703da255e07910b8b4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bruno=20Pr=C3=A9mont?= <bruno.premont@restena.lu>
Date: Mon, 25 Jan 2021 19:37:14 +0100
Subject: [PATCH] Fix compatibility with PHP-8

With PHP-7.x missing arginfo has been triggering warnings:
  NOTICE: PHP message: PHP Warning:  Missing arginfo for radius_auth_open() in Unknown on line 0
With PHP-8 this has become mandatory.
---
 radius.c | 216 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 188 insertions(+), 28 deletions(-)

diff --git a/radius.c b/radius.c
index 89ee0d6..4bfb429 100644
--- a/radius.c
+++ b/radius.c
@@ -61,39 +61,199 @@ ZEND_DECLARE_MODULE_GLOBALS(radius)
 /* True global resources - no need for thread safety here */
 static int le_radius;
 
+/* {{{ arginfo */
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_auth_open, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_acct_open, 0, 0, 0)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_close, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_strerror, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_config, 0, 0, 2)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, file)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_add_server, 0, 0, 6)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, hostname)
+	ZEND_ARG_INFO(0, port)
+	ZEND_ARG_INFO(0, secret)
+	ZEND_ARG_INFO(0, timeout)
+	ZEND_ARG_INFO(0, max_tries)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_create_request, 0, 0, 2)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, type)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_string, 0, 0, 3)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_int, 0, 0, 3)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_attr, 0, 0, 3)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_addr, 0, 0, 3)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, addr)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_vendor_string, 0, 0, 4)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, vendor)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_vendor_int, 0, 0, 4)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, vendor)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_vendor_attr, 0, 0, 4)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, vendor)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, value)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_put_vendor_addr, 0, 0, 4)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, vendor)
+	ZEND_ARG_INFO(0, type)
+	ZEND_ARG_INFO(0, addr)
+	ZEND_ARG_INFO(0, options)
+	ZEND_ARG_INFO(0, tag)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_send_request, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_get_attr, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_get_tagged_attr_data, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_get_tagged_attr_tag, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_get_vendor_attr, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_cvt_addr, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_cvt_int, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_cvt_string, 0, 0, 1)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_salt_encrypt_attr, 0, 0, 2)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_request_authenticator, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_server_secret, 0, 0, 1)
+	ZEND_ARG_INFO(0, radius_handle)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_demangle, 0, 0, 2)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, mangled)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO_EX(arginfo_radius_demangle_mppe_key, 0, 0, 2)
+	ZEND_ARG_INFO(0, radius_handle)
+	ZEND_ARG_INFO(0, mangled)
+ZEND_END_ARG_INFO()
+
+/* }}} */
+
+
 /* {{{ radius_functions[]
  *
  * Every user visible function must have an entry in radius_functions[].
  */
 zend_function_entry radius_functions[] = {
-	PHP_FE(radius_auth_open,    NULL)
-	PHP_FE(radius_acct_open,    NULL)
-	PHP_FE(radius_close,        NULL)
-	PHP_FE(radius_strerror,     NULL)
-	PHP_FE(radius_config,       NULL)
-	PHP_FE(radius_add_server,	NULL)
-	PHP_FE(radius_create_request,	NULL)
-	PHP_FE(radius_put_string,	NULL)
-	PHP_FE(radius_put_int,	NULL)
-	PHP_FE(radius_put_attr,	NULL)
-	PHP_FE(radius_put_addr,	NULL)
-	PHP_FE(radius_put_vendor_string,	NULL)
-	PHP_FE(radius_put_vendor_int,	NULL)
-	PHP_FE(radius_put_vendor_attr,	NULL)
-	PHP_FE(radius_put_vendor_addr,	NULL)
-	PHP_FE(radius_send_request,	NULL)
-	PHP_FE(radius_get_attr,	NULL)
-	PHP_FE(radius_get_tagged_attr_data, NULL)
-	PHP_FE(radius_get_tagged_attr_tag, NULL)
-	PHP_FE(radius_get_vendor_attr,	NULL)
-	PHP_FE(radius_cvt_addr,	NULL)
-	PHP_FE(radius_cvt_int,	NULL)
-	PHP_FE(radius_cvt_string,	NULL)
-	PHP_FE(radius_salt_encrypt_attr,	NULL)
-	PHP_FE(radius_request_authenticator,	NULL)
-	PHP_FE(radius_server_secret,	NULL)
-	PHP_FE(radius_demangle,	NULL)    
-	PHP_FE(radius_demangle_mppe_key,	NULL)    
+	PHP_FE(radius_auth_open,    arginfo_radius_auth_open)
+	PHP_FE(radius_acct_open,    arginfo_radius_acct_open)
+	PHP_FE(radius_close,        arginfo_radius_close)
+	PHP_FE(radius_strerror,     arginfo_radius_strerror)
+	PHP_FE(radius_config,       arginfo_radius_config)
+	PHP_FE(radius_add_server,	arginfo_radius_add_server)
+	PHP_FE(radius_create_request,	arginfo_radius_create_request)
+	PHP_FE(radius_put_string,	arginfo_radius_put_string)
+	PHP_FE(radius_put_int,	arginfo_radius_put_int)
+	PHP_FE(radius_put_attr,	arginfo_radius_put_attr)
+	PHP_FE(radius_put_addr,	arginfo_radius_put_addr)
+	PHP_FE(radius_put_vendor_string,	arginfo_radius_put_vendor_string)
+	PHP_FE(radius_put_vendor_int,	arginfo_radius_put_vendor_int)
+	PHP_FE(radius_put_vendor_attr,	arginfo_radius_put_vendor_attr)
+	PHP_FE(radius_put_vendor_addr,	arginfo_radius_put_vendor_addr)
+	PHP_FE(radius_send_request,	arginfo_radius_get_attr)
+	PHP_FE(radius_get_attr,	arginfo_radius_get_attr)
+	PHP_FE(radius_get_tagged_attr_data, arginfo_radius_get_tagged_attr_data)
+	PHP_FE(radius_get_tagged_attr_tag, arginfo_radius_get_tagged_attr_tag)
+	PHP_FE(radius_get_vendor_attr,	arginfo_radius_get_vendor_attr)
+	PHP_FE(radius_cvt_addr,	arginfo_radius_cvt_addr)
+	PHP_FE(radius_cvt_int,	arginfo_radius_cvt_int)
+	PHP_FE(radius_cvt_string,	arginfo_radius_cvt_string)
+	PHP_FE(radius_salt_encrypt_attr,	arginfo_radius_salt_encrypt_attr)
+	PHP_FE(radius_request_authenticator,	arginfo_radius_request_authenticator)
+	PHP_FE(radius_server_secret,	arginfo_radius_server_secret)
+	PHP_FE(radius_demangle,	arginfo_radius_demangle)
+	PHP_FE(radius_demangle_mppe_key,	arginfo_radius_demangle_mppe_key)
 	{NULL, NULL, NULL}	/* Must be the last line in radius_functions[] */
 };
 /* }}} */
--- a/php_radius.h	2016-02-15 10:11:50.000000000 -0500
+++ b/php_radius.h	2022-12-13 10:24:33.505295274 -0500
@@ -96,6 +96,14 @@
 #define RADIUS_OPTION_TAGGED	RAD_OPTION_TAG
 #define RADIUS_OPTION_SALT	RAD_OPTION_SALT
 
+#ifndef TSRMLS_D
+#define TSRMLS_D void
+#define TSRMLS_DC
+#define TSRMLS_C
+#define TSRMLS_CC
+#define TSRMLS_FETCH()
+#endif
+
 #endif	/* PHP_RADIUS_H */
 
 
--- a/radlib_compat.h	2016-02-15 10:11:50.000000000 -0500
+++ b/radlib_compat.h	2022-12-13 10:24:33.505295274 -0500
@@ -83,6 +83,14 @@
 	} while (0)
 #endif
 
+#ifndef TSRMLS_D
+#define TSRMLS_D void
+#define TSRMLS_DC
+#define TSRMLS_C
+#define TSRMLS_CC
+#define TSRMLS_FETCH()
+#endif
+
 #endif
 
 
--- a/tests/server/fake_server.php	2016-02-15 10:11:50.000000000 -0500
+++ b/tests/server/fake_server.php	2022-12-13 10:46:50.933484601 -0500
@@ -321,7 +321,7 @@
      *
      * @return boolean
      */
-    function skip() {
+    static function skip() {
         return !(function_exists('socket_create') && function_exists('pcntl_fork') && function_exists('radius_acct_open'));
     }
 
