Problem mit vpopmail/mysql einbindung ins eigene Programm



  • Hi, hab hier zur Zeit ein Problem das ich nicht erklären kann.

    Folgendes, ich hab ein qMail System zusammen mit vpopmail auf unserem Server am laufen.

    Jetzt versuche ich nun mittels eines kleinen C Scriptes an eien Funktion (namens vauth_getpw) von vpopmail anzudocken.

    Ziel des Scriptes ist die überprüfung ob ein gegebener User auf dem System existiert.

    Da ich auf inter7.org irgendwie überhaupt kein Doku finde wie man die Librarys korrekt einsetzt hab ich einfach mal gegoogelt und fremd-sourcen angeschaut.

    Überall hab ich beim "groben" gucken gesehen das immer nur die 3 Header Dateien von vpopmail eingebunden wurden und direkt die passende Funktion aufgerufen wird.

    Hiermal ausschnitt aus meinem Programmcode:

    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <netdb.h>
    #include <time.h>
    #include <sys/socket.h>
    #include "vpopmail.h"
    #include "vauth.h"
    #include "vpopmail_config.h"
    
    #define MAX_LINE_LEN 1000
    
    int main (int argc, char *argv[]) {
            int pipes[2];
            int i;
            size_t nbytes, pos;
            char one_row[MAX_LINE_LEN];
            char from[MAX_LINE_LEN];
            char *(qmailargv[2]);
            char uniqueid[100];
            char fromuser[500];
            char fromdomain[500];
            struct vqpasswd *user_passwd;
    
            { ... }
    
            searchFromHeader(from);
            if (is_username_valid(from)) {
                    fprintf (stderr, "From Header Valid\n");
                    parse_email(from, fromuser, fromdomain, 500);
                    fprintf (stderr, "User: %s\n", fromuser);
                    fprintf (stderr, "Domain: %s\n", fromdomain);
                    user_passwd = vauth_getpw(fromuser, fromdomain);
                    if (user_passwd == NULL) {
                            fprintf (stderr, "fehler\n");
                    } else {
                            fprintf (stderr, "ok\n");
                    }
                    //fprintf (stderr, "Passwort: %s\n", user_passwd->pw_passwd);
            } else {
                    fprintf (stderr, "User not found\n");
            }
    }
    

    searchFromHeader ist eine funktion von mir, die in einem komplexen char array den From header eine dadrin enthaltenen email sucht und den zeiger auf diese position (in *form) setzt.

    is_username_valid(from); ist von vpopmail.h und analysiert ob die email adresse korekt geschrieben wurde, sprich "buchstaben at buchstaben punkt buchstaben"

    parse_email(from, fromuser, fromdomain, 500); ist auch von vpopmail und trennt den domainnamen teil vom postfachuser teil.

    Beide Funktionen laufen einwandfrei.

    Nun kommts.
    vauth_getpw() gibt immer NULL zurück, egal was ich dort übergebe. NULL bedeutet aber eigentlich nach definition, kein Postfach vorhanden.

    Durch einen strace auf meinem Programm hab ich dann das Problem entdeckt.

    Die vpopmail lib ließt die vpopmail.mysql Datei aus, wo die Angaben zum MySQL Server drin stehen. Dort wurde "localhost" eingetragen und als Port "0".
    Das bedeutet er soll Sockets benutzen.

    Wenn ich mein Programm aufrufe probiert er aber einen connect auf 127.0.0.1 anstatt auf den Socket von mysql.

    Mach ich aber ein strace auf einen der vpopmail Programme, wird eine Socket Open auf den MySQL Socket durchgeführt und die Anfrage läuft einwandfrei.

    Kann sich das wer erklären? Könnte es evtl sein das ich noch irgednwas includen muss?
    Hab mal probiert in meinem Programm <sys/socket.h> zu includieren. Aber brachte auch keinen unterschied.

    Gucke ich mir den Source einer einfachen vpopmail Programms an, werden die connect daten ganz normal an die mysql library weiter gegeben.

    Bin sogar soweit gegangen udn hab flüchtig über den mysql lib source geguckt und dort wird wohl anhand von "localhost" und port "0" erkannt das er n unix socket verwenden soll.
    Allerdings is mir der Source doch ein wenig zu komplex ums wirklich korrekt zu verstehen. Bin leider nich so fit in C.

    Habt ihr irgendeine Idee oder einen anhaltspunkt den ich weiter verfolgen könnte?

    Grüße
    Jan


Anmelden zum Antworten