0

この日、私はその問題に関連するいくつかの質問を投稿しました。それだけ今、私は本当に面白いものを手に入れました。

私のコードを見てください:

#include <libpq-fe.h>
#include <stdlib.h>
#include <string.h>

#define LINE_SIZE 100

PGconn *connect(char *);

int main() 
{
    connect("/path/to/file.props");
    return 0;
}

PGconn *connect(char *file_path) 
{
    const char **keywords;
    const char **values;
    char *line = malloc(LINE_SIZE);
    char *prop, *val, *tmp;
    int i = 0, j = 0, k = 0;
    PGconn *conn = NULL;
    FILE *creds = fopen(file_path, "r");
    
    if (creds == NULL) {
        perror("error: cannot open credentials file");   //!!! warning
        exit(1);
    }
    
    keywords = malloc(6 * sizeof(char *));
    values = malloc(6 * sizeof(char *));
    
    while (fgets(line, LINE_SIZE, creds) != NULL) {
        if (line[strlen(line) - 1] == '\n')
            line[strlen(line) - 1] = '\0';
        prop = line;
        while(*(prop++) != '=') {
            i++;
        }
        tmp = prop;
        prop = malloc(i + 1);
        strncpy(prop, line, i);
        prop[i] = '\0';
        keywords[j++] = prop;
        val = malloc(strlen(line) - strlen(prop) + 1);
        strcpy(val, tmp);
        values[k++] = val;
        i = 0;
    }
    keywords[j] = NULL;
    values[k] = NULL;
    printf("%s %s %s %s %s\n", keywords[0], keywords[1], keywords[2], keywords[3], keywords[4]);
    printf("%s %s %s %s %s\n", values[0], values[1], values[2], values[3], values[4]); //prints well
    conn = PQconnectdbParams(keywords, values, 0);
    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
        exit(1);
    }
    
    return conn;
}

実行すると、次の出力が得られます。

hostaddrポートユーザーパスワードdbname

127.0.0.1 5432 my_user my_password my_db

エラー:クレデンシャルファイルを開くことができません:不正なアドレス

ご覧のとおり、ファイルの内容が印刷され、その内容が印刷された後にのみ、上記のエラー(「警告」コメントの行から)がそのファイルを読み取ることができないように印刷されます。

ここで何が起こるかについて何か考えがありますか?

4

1 に答える 1

7

「接続」は、ソケットに接続するためのシステムコールです。PQconnextdbParamsが「接続」を使用しようとし、関数に再度送信される可能性があると思います。関数の名前を「myconnect」に変更してみてください。

于 2013-02-25T14:46:07.977 に答える