Moin, gibt es in C/POSIX einen Weg, die Loginshell des aktuellen Users herauszufinden? Auf 'getenv("SHELL")' will ich nur zurückgreifen, wenn es nicht anders geht, schon weil ich nicht sicher bin, ob alle Shells das setzen. Danke schonmal! Thorsten -- Profanity is the inevitable linguistic crutch of the inarticulate motherfucker. - Bruce Sherrod
Thorsten Haude
gibt es in C/POSIX einen Weg, die Loginshell des aktuellen Users herauszufinden?
Ich dachte ja zuerst an getusershell(3), aber das liefert ja nur shells, die der Benutzer verwenden darf, nicht welche er aktuell verwendet- Philipp -- Philipp Thomas Arbeit: pthomas@suse.de Entwicklung, SuSE Linux AG Privat: philipp.thomas@t-link.de
Am Don, 2003-05-01 um 00.21 schrieb Thorsten Haude:
Moin,
gibt es in C/POSIX einen Weg, die Loginshell des aktuellen Users herauszufinden? Mir ist kein direkter Weg dazu bekannt.
Auf 'getenv("SHELL")' will ich nur zurückgreifen, wenn es nicht anders geht, schon weil ich nicht sicher bin, ob alle Shells das setzen.
Dazu sagt SUSv3: SHELL This variable shall represent a pathname of the user's preferred command language interpreter. Zu shall wird folgendes gesagt: shall For an implementation that conforms to IEEE Std 1003.1-2001, describes a feature or behavior that is mandatory. An application can rely on the existence of the feature or behavior. For an application or user, describes a behavior that is mandatory. Stellt sich aber auch die Frage, wozu Du das ganze brauchst. /bin/sh und system gibt es immer. Ralf
Moin,
* Ralf Corsepius
Am Don, 2003-05-01 um 00.21 schrieb Thorsten Haude:
Auf 'getenv("SHELL")' will ich nur zurückgreifen, wenn es nicht anders geht, schon weil ich nicht sicher bin, ob alle Shells das setzen.
Dazu sagt SUSv3:
Wer ist das?
SHELL This variable shall represent a pathname of the user's preferred command language interpreter.
Klingt wie mein Freund.
Stellt sich aber auch die Frage, wozu Du das ganze brauchst. /bin/sh und system gibt es immer.
Darüber verhandle ich gerade, aber im Grunde geht es darum, dem User seine Lieblingsshell zu geben. Das Problem wird dadurch verschärft, daß die Applikation bisher die /bin/csh als Defaultshell benutzt, und den Usern wollen wir den Übergang so sanft wie möglich gestalten. Danke! Thorsten -- All generalizations are false.
Hallo, leider habe ich die Ursprungsmail nicht bekommen, deshalb antworte ich jetzt mal auf diese: On Thu, 01 May 2003 at 03:00 (+0200), Ralf Corsepius wrote:
Am Don, 2003-05-01 um 00.21 schrieb Thorsten Haude:
gibt es in C/POSIX einen Weg, die Loginshell des aktuellen Users herauszufinden?
Mir ist kein direkter Weg dazu bekannt.
Auf 'getenv("SHELL")' will ich nur zurückgreifen, wenn es nicht anders geht, schon weil ich nicht sicher bin, ob alle Shells das setzen.
Finde ich auch nicht besonders toll. Was spricht gegen sowas wie /* include stdio.h, unistd.h, sys/types.h, stdlib.h, pwd.h */ struct passwd *pw_struct; pw_struct = getpwuid( getuid() ); printf("Die Login-Shell heisst: %s\n", pw_struct->pw_shell); In den Manpages steht `conforming to POSIX' drin. Fragt sich bloss ob man den Speicher wieder freigeben muss, beim Aufruf von free bekomme ich einen Speicherzugriffsfehler. Auf der anderen Seite steht in man getpwuid nicht drin dass der Pointer auf was statisches zeigen wuerde. Wenn nicht dann wuerde schon getpwuid( getuid() )->pw_shell ausreichen. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Die Geschichte lehrt die Menschen, dass die Geschichte die Menschen nichts lehrt. -- Mahatma Ghandi
Moin,
* Bernhard Walle
Am Don, 2003-05-01 um 00.21 schrieb Thorsten Haude:
gibt es in C/POSIX einen Weg, die Loginshell des aktuellen Users herauszufinden? Auf 'getenv("SHELL")' will ich nur zurückgreifen, wenn es nicht anders geht, schon weil ich nicht sicher bin, ob alle Shells das setzen.
Finde ich auch nicht besonders toll. Was spricht gegen sowas wie
/* include stdio.h, unistd.h, sys/types.h, stdlib.h, pwd.h */ struct passwd *pw_struct; pw_struct = getpwuid( getuid() ); printf("Die Login-Shell heisst: %s\n", pw_struct->pw_shell);
Nix, nach genau sowas hatte ich gefragt. Danke!
In den Manpages steht `conforming to POSIX' drin. Fragt sich bloss ob man den Speicher wieder freigeben muss, beim Aufruf von free bekomme ich einen Speicherzugriffsfehler. Auf der anderen Seite steht in man getpwuid nicht drin dass der Pointer auf was statisches zeigen wuerde.
Die Manpages von OpenBSD und FreeBSD sind da klarer, da ist von einer internen statischen Struktur die Rede. Ein kurzer Blick in die libc scheint das zu bestätigen. Thorsten -- You're not supposed to be so blind with patriotism that you can't face reality. Wrong is wrong, no matter who does it or who says it. - Malcolm X
On Thu, 01 May 2003 at 11:59 (+0200), Thorsten Haude wrote:
* Bernhard Walle
[2003-05-01 10:43]: In den Manpages steht `conforming to POSIX' drin. Fragt sich bloss ob man den Speicher wieder freigeben muss, beim Aufruf von free bekomme ich einen Speicherzugriffsfehler. Auf der anderen Seite steht in man getpwuid nicht drin dass der Pointer auf was statisches zeigen wuerde.
Die Manpages von OpenBSD und FreeBSD sind da klarer, da ist von einer internen statischen Struktur die Rede. Ein kurzer Blick in die libc scheint das zu bestätigen.
Unter Linux steht nur ERRORS ENOMEM Insufficient memory to allocate passwd structure. und das hat sich fuer mich so angehoert als ob der Speicher dynamisch mit malloc() angefordert wurde. Aber in der Info-Page zur libc steht (hab jetzt eben nachgeschaut): - Function: struct passwd * getpwuid (uid_t UID) This function returns a pointer to a statically-allocated structure containing information about the user whose user ID is UID. This structure may be overwritten on subsequent calls to `getpwuid'. Das ist dann eindeutig. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Wenn zwei Menschen immer dasselbe denken, ist einer von ihnen überflüssig." -- Winston Churchill
participants (4)
-
Bernhard Walle
-
Philipp Thomas
-
Ralf Corsepius
-
Thorsten Haude