それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php7で拡張機能のAPIが変わって動かなくなってる pamをなんとかした

php 7 で pamモジュールが動かなかった。

install してもPHPのPAMが動かなかったんですね。

PHPC言語APIが変わってた

コンパイルエラーなので、調べていくと型宣言辺で落ちてた。 調べていくと、拡張機能APIが更新されてたことがわかったなど

この方法で、PAMを使ったphp拡張の作り方がわかった。

PHPの拡張をCで書く方法が分かったし世界が広がリング

http://keicode.com/cgi/how-to-handle-parameters-php-extension.php

php-pamについて

ドコをどう書き換えるべきか書いてあるのはこちら。

https://wiki.php.net/phpng-upgrading

--- /tmp/pam-1.0.3/pam.c        2009-11-29 19:49:35.000000000 +0900
+++ pam.c       2017-10-19 01:52:15.028468810 +0900
@@ -227,8 +227,13 @@
 PHP_FUNCTION(pam_auth)
 {
        char *username, *password;
-       int username_len, password_len;
-       zval *status = NULL, **server, **remote_addr;
+       size_t username_len, password_len;
+       /* zval status; */
+       /* zval *server; */
+       /* zval *remote_addr; */
+       zval *status = NULL;
+       zval *server;
+       zval *remote_addr;
        zend_bool checkacctmgmt = 1;

        pam_auth_t userinfo = {NULL, NULL};
@@ -244,26 +249,28 @@
        userinfo.name = username;
        userinfo.pw = password;

+       /* printf("Hello"); */
+
        if ((result = pam_start(PAM_G(servicename), userinfo.name, &conv_info, &pamh)) != PAM_SUCCESS) {
                if (status) {
                        spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_start");
-                       zval_dtor(status);
-                       ZVAL_STRING(status, error_msg, 0);
+                       ZVAL_STRING(status, error_msg);
+                       efree(error_msg);
                }
                RETURN_FALSE;
        }

-       if (zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **)&server) == SUCCESS && Z_TYPE_PP(server) == IS_ARRAY) {
-               if (zend_hash_find(Z_ARRVAL_PP(server), "REMOTE_ADDR", sizeof("REMOTE_ADDR"), (void **)&remote_addr) == SUCCESS && Z_TYPE_PP(remote_addr) == IS_STRING) {
-                       pam_set_item(pamh, PAM_RHOST, Z_STRVAL_PP(remote_addr));
+       if ( (server=zend_hash_str_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER")-1 ) )  != NULL  && Z_TYPE_P(server) == IS_ARRAY) {
+               if ( ( remote_addr = zend_hash_str_find( Z_ARRVAL_P(server), "REMOTE_ADDR", sizeof("REMOTE_ADDR")-1 ) )   != NULL && Z_TYPE_P(remote_addr) == IS_STRING) {
+                       pam_set_item(pamh, PAM_RHOST, Z_STRVAL_P(remote_addr));
                }
        }

        if ((result = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK)) != PAM_SUCCESS) {
                if (status) {
                        spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_authenticate");
-                       zval_dtor(status);
-                       ZVAL_STRING(status, error_msg, 0);
+                       ZVAL_STRING(status, error_msg);
+                       efree(error_msg);
                }
                pam_end(pamh, PAM_SUCCESS);
                RETURN_FALSE;
@@ -274,7 +281,8 @@
                        if (status) {
                                spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_acct_mgmt");
                                zval_dtor(status);
-                               ZVAL_STRING(status, error_msg, 0);
+                               ZVAL_STRING(status, error_msg);
+                               efree(error_msg);
                        }
                        pam_end(pamh, PAM_SUCCESS);
                        RETURN_FALSE;
@@ -312,7 +320,8 @@
                if (status) {
                        spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_start");
                        zval_dtor(status);
-                       ZVAL_STRING(status, error_msg, 0);
+                       ZVAL_STRING(status, error_msg);
+                       efree(error_msg);
                }
                RETURN_FALSE;
        }
@@ -321,7 +330,8 @@
                if (status) {
                        spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_authenticate");
                        zval_dtor(status);
-                       ZVAL_STRING(status, error_msg, 0);
+                       ZVAL_STRING(status, error_msg);
+                       efree(error_msg);
                }
                pam_end(pamh, PAM_SUCCESS);
                RETURN_FALSE;
@@ -331,7 +341,8 @@
                if (status) {
                        spprintf(&error_msg, 0, "%s (in %s)", (char *) pam_strerror(pamh, result), "pam_chauthtok");
                        zval_dtor(status);
-                       ZVAL_STRING(status, error_msg, 0);
+                       ZVAL_STRING(status, error_msg);
+                       efree(error_msg);
                }
                pam_end(pamh, PAM_SUCCESS);
                RETURN_FALSE;