PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Benutzerverzeichnis



tiris
31-07-2002, 22:53
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

Demonus
01-08-2002, 06:37
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.

tiris
04-08-2002, 20:48
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

DerLipper[TuX]
04-08-2002, 21:32
versuchs mal mit folgendem:



file = fopen("~/test","wb");

if (NULL == file)
{
fprintf(stderr,"Error opening file %s\n.Program aborting","~/test");
exit(-1);
}

...tu irgendwas


Gruß,
Marko

tiris
04-08-2002, 22:01
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

tkortkamp
04-08-2002, 22:49
Wieso? Ist doch klar erklärt:


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:


char *home = getenv("HOME");

Der Rest ist eine Sache von den Stringfunktionen.

c ya,
Tobias

tiris
05-08-2002, 16:45
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!");
}

anda_skoa
05-08-2002, 16:56
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,
_

tiris
07-08-2002, 16:06
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

anda_skoa
07-08-2002, 16:42
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,
_

tiris
07-08-2002, 17:48
Ok, den wollen wir natürlich vermeiden. :D 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

tiris
08-08-2002, 17:21
Ich komm mir jetzt ein bißchen blöd vor.:rolleyes: 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

anda_skoa
08-08-2002, 18:23
benutz strlen um die länge der beiden teilstrings zu ermitteln



int len = strlen(home) + strlen(pfad) + 1; // das 1 ist für den abschliessenden \0


Ciao,
_