Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Benutzerverzeichnis

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59

    Question Benutzerverzeichnis

    Hi,
    Also ich will unter SuSE auf das Verzeichnis des jeweiligen Benutzers zugreifen, ohne das das jedesmal beim Compilieren oder so dem Programm mitgegeben wird. Gibt es da so eine Art Umbebungsvariable der Art "$USER" oder so ähnlich. Bin dankbar für jeden Tip.

    Tiris
    In a world wothout fences, who
    needs Gates?

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.01.2002
    Ort
    DarkTown
    Beiträge
    40
    Es gibt die Umgebungsvariable USER, die den Namen des jeweiligen Benutzers enthält
    und auch ein Variable HOME, die den Path das Home-Verzeichnis enthält.
    Eine Umgebungsvariable auslesen kannst du mit der C-Funktion getenv.
    When there`s no more room in Hell
    the dead will walk the Earth

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59

    Question

    Hi,
    Hat leider nicht geklappt. Wie soll denn die Syntax sein. Ich hab
    file = fopen(USER"test", "wb");
    und
    file = fopen("/USER/test", "wb");

    versucht. Ich denke irgenwo hab ich was falsch geschriben, aber die man pages sind an der Stelle ein bißchen komisch.

    tiris
    In a world wothout fences, who
    needs Gates?

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.05.2001
    Ort
    Lipperland
    Beiträge
    24
    versuchs mal mit folgendem:

    Code:
    file = fopen("~/test","wb");
    
    if (NULL == file)
    {
        fprintf(stderr,"Error opening file %s\n.Program aborting","~/test");
        exit(-1);
    }
    
    ...tu irgendwas
    Gruß,
    Marko
    My systems:
    AMD Athlon XP 1700MHz, 512MB RAM,Geforce 4200
    AMD Duron 1300Mhz, 512MB

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59
    Das mit der Fehlermeldung hatte ich schon vorher eingebaut, nur bei meinem Beispiel weggelassen. Ich bin auch dahinter gekommen dass man sich wohl die Konstante USER wohl per "#define USER" machen muß und erst dann den Wert einlesen kann. Aber wenn ich es jetzt mit

    #include <stdio.h>
    #include <stlib.h>

    #define USER

    void main()
    {
    FILE *file;
    char *getenv(USER);
    if ((file = fopen("/USER/test", "wb")) == NULL)
    printf ("\nFehler beim Erzeugen der Datei");



    }

    versuche kommt auch nichts dabei raus. Das ist so eine man-page von 93. Kann keine Sau was mit anfangen, nur 10 Zeilen. Es steht einfach nicht anständig drin wie man die Variable ausliest.

    tiris
    In a world wothout fences, who
    needs Gates?

  6. #6
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Wieso? Ist doch klar erklärt:
    Code:
    GETENV(3)             Bibliotheksfunktionen             GETENV(3)
    
    BEZEICHNUNG
           getenv - lese eine Umgebungsvariable aus
    
    ÜBERSICHT
           #include <stdlib.h>
    
           char *getenv(const char *name);
    
    BESCHREIBUNG
           Die  Funktion  getenv() durchsucht die Umgebungsliste nach
           einem String der auf den String passt, auf den name zeigt.
           Die Strings haben die Form name = value.
    
    RÜCKGABEWERT
           Die  Funktion  getenv()  gibt einen Zeiger auf den Wert im
           Umgebungsbereich zurück, oder NULL, wenn es keine Überein*-
           stimmung gibt.
    
    KONFORM ZU
           SVID 3, POSIX, BSD 4.3, ISO 9899
    
    SIEHE AUCH
           putenv(3),   setenv(3),  clearenv(3),  unsetenv(3),  envi*ron(7).
    
    GNU                        1. Juni 1996                 GETENV(3)
    Das Heimatverzeichnis des Users bekommst du so:
    Code:
    char *home = getenv("HOME");
    Der Rest ist eine Sache von den Stringfunktionen.

    c ya,
    Tobias
    Geändert von tkortkamp (04-08-2002 um 22:51 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59
    Ich habs jetzt raus.
    Den Quellcode hab ich angehängt. Ich muß erst einen kompletten String mit dem Dateinamen erzeugen, über strcat, sonst hat fopen zu viele Argumente und macht nichts. Aber so klappt es jetzt genau so wie ich es wollte.
    Danke an alle.

    tiris

    # include <stdio.h>
    # include <stdlib.h>
    # include <string.h>

    void main()
    {
    FILE *datei;
    char *home = getenv("HOME");
    if (home == NULL)
    printf ("Fehler beim Suchen der Umgebungsvariablen!\n");
    printf("%s\n", home);
    strcat(home, "/test");
    if((datei = fopen(home ,"wb")) == NULL)
    printf ("\nFehler beim erstellen der Zieldatei!");
    }
    In a world wothout fences, who
    needs Gates?

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Das könnte ins Auge gehen, strcat vergößert nich den Zielstring.
    Wenn home gerade lange genug für den Pfad ist, überschreibst du den Speicher dahinter, wahrscheinlich einen anderen Environmentwert.

    besser du legst einen neuen Puffer an, der lange genug für Pfad+Dateiname ist und kopiersr home da hinein, bevor du strcat machst.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59
    Daran habe ich auch schon gedacht, aber ich hab ja gar keinen Zielstring definiert. getenv liefert den Pointer auf das erste Feld eines Arrays, diesen Array lese ich aus und hänge dann was an, aber dabei benutze ich doch nicht den Bereich in dem die Umgebungsvariable am Anfang gestanden hat, sondern einen neuen Bereich im Speicher, oder?

    tiris
    In a world wothout fences, who
    needs Gates?

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    man strcat sagt:
    The strcat() function appends the src string to the dest
    string overwriting the `\0' character at the end of dest

    D.h. der zweite String wird an den ersten angehängt, in dem er das \0 am Ende des Zielstrings überschreibt.
    Also direkt im env, der Eintrag von HOME wird dort also entsprechend länger und überschreibt alles, was direkt hinter dem echte \0 stand.

    Ein typischer Bufferoverflow.

    Wenn du die beiden strings zusammenhängen willst, kommst du nicht umhin, neuen Speiche daüfr zu reservieren.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59
    Ok, den wollen wir natürlich vermeiden. Ich hab das in der man page auch gelesen, aber anders interpretiert, von der Speicherzuweisung her. Mmhh, muß mir wohl mal was besorgen wo die Sachen von der technischen Seite erklärt werden.
    Muchas gratias.

    tiris
    In a world wothout fences, who
    needs Gates?

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.06.2002
    Ort
    Ober-Ramstadt
    Beiträge
    59
    Ich komm mir jetzt ein bißchen blöd vor. Also den String leg ich ja gerne an, aber wie lang soll der denn sein? Ich hab nachgeguckt und überall steht dass der Login nicht länger als 8 Zeichen sein sollte und dass mit useradd auch nicht mehr geht. Man kann das aber ja in der Konfigurationsdatei umgehen... Gibt es eine maximale Länge oder muß ich einfach mal einen 100 Zeichen String reservieren. (geht ja von der Hardware her problemlos, aber ich mag es nunmal nicht Resourcen zu vergeuden.)

    tiris
    In a world wothout fences, who
    needs Gates?

  13. #13
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    benutz strlen um die länge der beiden teilstrings zu ermitteln

    Code:
    int len = strlen(home) + strlen(pfad) + 1; // das 1 ist für den abschliessenden \0
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •