getuid/getpwuid benutzen funktioniert nicht



  • Hallo 🙂

    ich "darf" fuer die Uni in einer Hausuebung in einer kleinen (vorgegebenen) Shell eine funktion hinzufuegen, die in das Heimatverzeichnis des aufrufenden Benutzers wechselt.

    Den Heimatpfad sollen wir ermitteln, indem wir mit getuid() die User Id ermitteln, diese dann an getpwuid() uebergeben, und dann pw_dir auslesen.

    Mein Problem ist, dass ich irgendwie es nicht schaffe, getpwuid() und getuid() zu benutzen.

    Wie muss ein Zugriff darauf aussehen? Wie uebergebe ich den wert von getuid() an getpwuid(), und wie greife ich dann auf pw_dir zu?

    if(strcmp(k->einfach.worte[0],"cd") ==0){
    	cout<<"Cd wurde angefordert\n";
    	uid_t uid;
    	cout<<"uid_t zuweisung geht";
    	struct passwd* uinfo = 0;
    	cout<<"struckt geht\n";
    	uinfo = getpwuid(uid);
    	string test = uinfo->pw_dir;
    	cout<<"getpwuid aufruft geht\n";
    	//cout<<uinfo.pw_dir;
    	exit(0);
        }
    

    erzeugt beim ausfuehren lediglich ein

    Segmentierungsfehler (core dumped)

    ist aber die einzige Version die ich bisher ueberhaupt zum laufen gebracht habe 😞

    (die Cout Anweisungen waren nur zum testen, wo die der Fehler anfaengt..

    uid_t zuweisung gehtstruckt geht

    geht nicht, dann kommt der Segemntierungsfehler. 😕



  • lies doch einfach die env-variable HOME (per getenv) ein und schon hast du das home-verzeichniss.

    char * homepath = gentenv("HOME");
    

    Oder wenn du eh nur in das verzeichniss wechseln solltest, kannst du auch ein

    chdir("~")
    

    machen.



  • danke fuer den Tip, wuerde ich auch (gerne) machen, aber die beiden Funktionen sind ausdruecklich vorgegeben, dass wir sie benutzen sollen 😞

    also->Daten mit getuid() und getpwuid() auslesen und dann (mit chdir()?) in das Verzeichnis wechseln 😕



  • uid_t uid;
    cout<<"uid_t zuweisung geht";

    falsch weil keine zuweisung passiert und daher uid irgendeinen wert hat



  • daHa schrieb:

    uid_t uid;
    cout<<"uid_t zuweisung geht";

    falsch weil keine zuweisung passiert und daher uid irgendeinen wert hat

    wie mein vorredner implizit schon sagte, wo ist dein getuid() aufruf?



  • sorry dass ich mich erst jetzt melde, konnte erst jetzt wieder an den Rechner..

    stimmt, das getuid() hatte ich in der Version vergessen. *schaem*

    das original war (ohne die "Testausgaben")

    if(k->einfach.wortanzahl==1){
    		uid_t uid;
    		uid = getuid();
    		struct passwd* uinfo = 0;
    		uinfo = getpwuid(uid);
    		exit(0);
    }
    

    das wird auch vom Compiler tadelos uebersetzt, aber wie greife ich nun auf die Felder zu?

    string test = uinfo->pw_dir;
    string test2 = uinfo.pw_dir;
    

    erzeugt beides die Ausgabe

    Fehler: request for member `pw_dir' in `uinfo', which is of non-class type `passwd*'

    vom Compiler.



  • variable.element
    

    ist ein Zugriff auf ein Element der struct oder class mit dem Namen "variable".

    variable->element
    

    ist ein Zugriff auf ein Element der struct oder class, die von der Zeigervariablen "variable" referenziert wird.

    Auf Dein Problem übertragen: Welchen Datentyp hat die Variable "uinfo"? Ist es eine struct oder ein Zeiger auf eine struct? Wenn Du darauf kommst, solltest Du wissen, welcher Operator hier zu verwenden ist.

    Ganz abgesehen davon sagt Dir der Compiler sogar, welcher von beiden falsch ist. Aber durch ausprobieren sollte man solche Probleme nicht lösen.

    Tntnet



  • komisch.. zuerst ging bei beiden Aufrufen nichts, jetzt auf einmal gehts.. danke 🙂

    (ja... normalerweise geht man nicht so vor, war nur am verzweifeln... bin wohl aus c++ schon wieder zu sehr draussen *seufz*).

    Danke fuer die Hilfe 🙂 *freu*


Anmelden zum Antworten