Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

libpopt

6 views
Skip to first unread message

Andreas Wiese

unread,
May 11, 2002, 9:59:16 AM5/11/02
to
Hallo,

ich moechte gerne per popt-Library Kommandozeilenargumente abarbeiten. Ich
moechte es aber so, dass poptGetNextOpt() mit -1 zurueckkehrt (Ende der
Argumentenliste), sobald irgendetwas auf der Kommandozeile auftaucht, was
keine Option ist - also wie das Verhalten von getopt(3), wenn das erste
Zeichen vom opstring ein '+' ist oder i.A. POSIXLY_CORRECT gesetzt ist. Kann
man das realisieren? An sich muss es gehen, da poptGetNextOpt() ebenfalls
auf $POSIXLY_CORRECT reagiert, ich moechte aber nicht unbedingt vor dem
Auslesen der Argumentenliste die Variable setzen und danach den alten
Zustand wiederherstellen.

Weiss jemand, wie man das machen kann (und verraet's mir auch)?

TIA

Gruesse,

awiese
--
--- \|/ ______ \|/
Andreas Wiese "@' / , . \ `@"
awiese....@t-online.de /__| \____/ |__\
http://www.root-for-everybody.de.vu \___U__/

Felix von Leitner

unread,
May 11, 2002, 9:40:58 AM5/11/02
to
Thus spake Andreas Wiese (awiese....@t-online.de):

> Weiss jemand, wie man das machen kann (und verraet's mir auch)?

Wenn du erkannt hast, daß popt trotz der über 20fachen Größe viel
schlechter als getopt ist, welches auch noch standardisiert ist, wieso
benutzt du dann nicht einfach getopt?

popt -> Tonne.

Andreas Wiese

unread,
May 11, 2002, 11:10:51 AM5/11/02
to
Felix von Leitner <usenet-...@fefe.de> dicebat:

Hab ich ja bis jetzt gemacht (getopt() oder getopt_long(), je nach
Vorhandensein). Ich habe mir jetzt aber von Herold
'Linux/UNIX-Systemprogrammierung' gekauft und da steht neben getopt() und
getopt_long() auch libpopt drin. Ich wollt's mal ausprobieren. Ausserdem
fand ich's interessant, dass man - will man das - nur einmal
poptGetNextOpt() aufrufen muss um die gesammte Kommandozeile abzuarbeiten
und Optionsargumente werden gleich da gespeichert, wo sie hin sollen. Was
IMHO am interessantesten ist, ist auch noch das Options-Aliasing.

Was die Standardisierung betrifft: im Herold steht 'Das Softwarepaket popt
[...] sollte auf jedem System verwendet werden koennen, das sich an den
POSIX-Standard haelt'. Das ist ja AFAIK bei getopt_long() nicht der Fall.
Hups... Wie ich gerade festellen muss, besitzt mein (VMware- ;) FreeBSD
weder getopt_long() noch libpopt.

> popt -> Tonne.

Ja, hast ja recht. Ob ich mich nun noch durch die autoconf-Dokumentation
wuehle um zu sehen, wie ich nach Libraries suche und die entsprechende
Option in die LDFLAGS einbinde oder einfach nur auf getopt.h und
getopt_long() teste... letzteres ist doch wesentlich einfacher.

Andreas Wiese

unread,
May 11, 2002, 11:40:46 AM5/11/02
to
Andreas Wiese <awiese....@t-online.de> dicebat:

> Felix von Leitner <usenet-...@fefe.de> dicebat:
>> Thus spake Andreas Wiese (awiese....@t-online.de):
>>> Weiss jemand, wie man das machen kann (und verraet's mir auch)?
>>
>> Wenn du erkannt hast, daß popt trotz der über 20fachen Größe viel
>> schlechter als getopt ist, welches auch noch standardisiert ist, wieso
>> benutzt du dann nicht einfach getopt?
>>
>

[snip... Begruendung fuer libpopt]

>
>> popt -> Tonne.
>

[snip... Einverstaendnis]

P.S.: Kann mir trotzdem jemand sagen wie's geht ;) - fuer Versuchszwecke?

>
> Gruesse,
>
> awiese

Nochmal...

Hendrik Sattler

unread,
May 11, 2002, 11:57:54 AM5/11/02
to
Andreas Wiese wrote:
> und Optionsargumente werden gleich da gespeichert, wo sie hin sollen. Was
> IMHO am interessantesten ist, ist auch noch das Options-Aliasing.
^^^^^^^^^^^^^^^^
Und warum sollte das mit getopt_long nicht gehen? Netter Name für eine
simple Funtkionsweise. Oder stelle ich mir darunter was falsches vor?

> Was die Standardisierung betrifft: im Herold steht 'Das Softwarepaket popt
> [...] sollte auf jedem System verwendet werden koennen, das sich an den
> POSIX-Standard haelt'. Das ist ja AFAIK bei getopt_long() nicht der Fall.
> Hups... Wie ich gerade festellen muss, besitzt mein (VMware- ;) FreeBSD
> weder getopt_long() noch libpopt.

Doch, unter FreeBSD muß du libgnugetopt installieren und damit linken. Bei
NetBSD ist es in den aktuellen Versionen AFAIK in der libc mit drin.



>> popt -> Tonne.
>
> Ja, hast ja recht. Ob ich mich nun noch durch die autoconf-Dokumentation
> wuehle um zu sehen, wie ich nach Libraries suche und die entsprechende
> Option in die LDFLAGS einbinde oder einfach nur auf getopt.h und
> getopt_long() teste... letzteres ist doch wesentlich einfacher.

Siehe oben, für autoconf z.B.:
AC_CHECK_FUNC(getopt_long,
,
AC_CHECK_LIB(gnugetopt,
getopt_long,
LDADD="${LDADD} -lgnugetopt",
echo "*** You need to get libgnugetopt ***";exit
)
)

Hendrik

Andreas Wiese

unread,
May 11, 2002, 12:55:38 PM5/11/02
to
Hendrik Sattler <sattl...@gmx.de> dicebat:

> Andreas Wiese wrote:
>> und Optionsargumente werden gleich da gespeichert, wo sie hin sollen. Was
>> IMHO am interessantesten ist, ist auch noch das Options-Aliasing.
> ^^^^^^^^^^^^^^^^
> Und warum sollte das mit getopt_long nicht gehen? Netter Name für eine
> simple Funtkionsweise. Oder stelle ich mir darunter was falsches vor?
>

Wenn ich mir jetzt unter dem was du dir vorstellst das richtige vorstelle,
dann ja.

Ich denke, du meinst das:

,---[ getopttest.c ]--------------------------------------------------------
|
| #include <stdio.h>
| #include <getopt.h>
|
| struct option opts[] = {
| { "blafasel", 0, 0, 'b' },
| { "copyright", 0, 0, 'c' },
| { "copyleft", 0, 0, 'c' },
| { 0, 0, 0, 0 }
| };
|
| int main(int argc, char *argv[])
| {
| int optc, b = 0, c = 0;
|
| while((optc = getopt_long(argc, argv, "bc", opts, NULL)) != EOF) {
| switch(optc) {
| case 'b':
| b = 1;
| break;
| case 'c':
| c = 1;
| break;
| default:
| fprintf(stderr,
| "Usage: %s [-bc]\n", argv[0]);
| exit(1);
| break;
| }
| }
|
| if(b)
| printf("blafasel wurde gewaehlt.\n");
|
| if(c)
| printf("Diese Software ist GPLt.\n");
|
| return 0;
| }
|
`---------------------------------------------------------------------------

Jetzt liefern 'getopttest --copyright', 'getopttest --copyleft' und
'getopttest -c' das selbe Ergebnis.

War so gemeint, oder?

Ich meinte aber was anderes. Mit libpopt kann man aber
'Konfigurationsdateien' einlesen, die dann Zeilen ala'
'name alias --drei --eins --zwei'
enthalten. 'name' gibt dabei den Namen des Programms an, alias ist ein
Schluesselwort und die Option --drei steht zukuenftig fuer '--eins --zwei',
wenn ich also 'name --drei' aufrufe, ist das das gleiche wie
'name --eins --zwei'. Das geht AFAIK mit getopt{_long,}() nicht.

>> Was die Standardisierung betrifft: im Herold steht 'Das Softwarepaket popt
>> [...] sollte auf jedem System verwendet werden koennen, das sich an den
>> POSIX-Standard haelt'. Das ist ja AFAIK bei getopt_long() nicht der Fall.
>> Hups... Wie ich gerade festellen muss, besitzt mein (VMware- ;) FreeBSD
>> weder getopt_long() noch libpopt.
>
> Doch, unter FreeBSD muß du libgnugetopt installieren und damit linken. Bei
> NetBSD ist es in den aktuellen Versionen AFAIK in der libc mit drin.
>

Aha. Gut zu wissen. Bei Linux ist getopt_long() ja offensichtlich auch mit
in der libc. Mein configure-Skript testet momentan nur, ob getopt_long()
oder getopt() existieren und in einer Headerdatei steht dann sowas:

#if defined(HAVE_GETOPT_LONG) && defined(HAVE_GETOPT_H)
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif
# include <getopt.h>
# ifndef my_getopt
# define my_getopt(A,B,C,D,E) getopt_long(A,B,C,D,E)
# endif
#elif defined(HAVE_GETOPT)
# ifndef my_getopt
# define my_getopt(A,B,C,D,E) getopt(A,B,C)
# endif
#else
# error Uaerks.
#endif

Nicht schoen aber selten ;)

>>> popt -> Tonne.
>>
>> Ja, hast ja recht. Ob ich mich nun noch durch die autoconf-Dokumentation
>> wuehle um zu sehen, wie ich nach Libraries suche und die entsprechende
>> Option in die LDFLAGS einbinde oder einfach nur auf getopt.h und
>> getopt_long() teste... letzteres ist doch wesentlich einfacher.
>
> Siehe oben, für autoconf z.B.:
> AC_CHECK_FUNC(getopt_long,
> ,
> AC_CHECK_LIB(gnugetopt,
> getopt_long,
> LDADD="${LDADD} -lgnugetopt",
> echo "*** You need to get libgnugetopt ***";exit
> )
> )
>

Ich werd mir 'info autoconf' nochmal genauer angucken. Hab's gestern
aufgegeben.

> Hendrik

Hendrik Sattler

unread,
May 11, 2002, 1:23:45 PM5/11/02
to
Andreas Wiese wrote:
> Hendrik Sattler <sattl...@gmx.de> dicebat:
>> Andreas Wiese wrote:
>>> und Optionsargumente werden gleich da gespeichert, wo sie hin sollen.
>>> Was IMHO am interessantesten ist, ist auch noch das Options-Aliasing.
>> ^^^^^^^^^^^^^^^^
>> Und warum sollte das mit getopt_long nicht gehen? Netter Name für eine
>> simple Funtkionsweise. Oder stelle ich mir darunter was falsches vor?
>>
>
> Wenn ich mir jetzt unter dem was du dir vorstellst das richtige vorstelle,
> dann ja.
>
> Ich denke, du meinst das:
[...]

> Jetzt liefern 'getopttest --copyright', 'getopttest --copyleft' und
> 'getopttest -c' das selbe Ergebnis.
> War so gemeint, oder?

Ja.



> Ich meinte aber was anderes. Mit libpopt kann man aber
> 'Konfigurationsdateien' einlesen, die dann Zeilen ala'
> 'name alias --drei --eins --zwei'
> enthalten. 'name' gibt dabei den Namen des Programms an, alias ist ein
> Schluesselwort und die Option --drei steht zukuenftig fuer '--eins
> --zwei', wenn ich also 'name --drei' aufrufe, ist das das gleiche wie
> 'name --eins --zwei'. Das geht AFAIK mit getopt{_long,}() nicht.

Hmm, brauch ich net. Wüßte auch nicht, wozu das wirklich gut sein sollte.



>> Doch, unter FreeBSD muß du libgnugetopt installieren und damit linken.
>> Bei NetBSD ist es in den aktuellen Versionen AFAIK in der libc mit drin.
>>
>
> Aha. Gut zu wissen. Bei Linux ist getopt_long() ja offensichtlich auch mit
> in der libc. Mein configure-Skript testet momentan nur, ob getopt_long()
> oder getopt() existieren und in einer Headerdatei steht dann sowas:
>
> #if defined(HAVE_GETOPT_LONG) && defined(HAVE_GETOPT_H)
> # ifndef _GNU_SOURCE
> # define _GNU_SOURCE
> # endif
> # include <getopt.h>
> # ifndef my_getopt
> # define my_getopt(A,B,C,D,E) getopt_long(A,B,C,D,E)
> # endif
> #elif defined(HAVE_GETOPT)
> # ifndef my_getopt
> # define my_getopt(A,B,C,D,E) getopt(A,B,C)
> # endif
> #else
> # error Uaerks.
> #endif
>
> Nicht schoen aber selten ;)

Ich setze getopt_long einfach vorraus (mit dem Check mit configure). Punkt.
Allerdings ist getopt_long beim einlesen der Optionen auch nicht
fehlerfrei, besonders wenn ein Parameter ein _optionales_ Argument hat geht
zwar ein (--foo = -f)
myprog --foo arg
und
myprog -farg
aber nicht:
myprog -f arg
Dumm wenn jetzt -a, -r und -g auch mögliche Parameter sein können. Und ja,
das ist hier (Linux):
$ /lib/libc.so.6
GNU C Library stable release version 2.2.5
sehr reproduzierbar. Mit vorgeschriebenen Argument für den Parameter gibts
das Problem nicht.
Hab dazu noch keine Lösung gefunden. Wenn jemand eine weiß, währe ich
äußerst dankbar.

HS


Andreas Wiese

unread,
May 11, 2002, 1:48:38 PM5/11/02
to

[snip...]

Als Beispiel wieder mein (verhasstes ;) root-Prograemmchen: ich habe einen
Benutzer namens awiese.mephisto auf meinem Rechner, in dessen
Homeverzeichnis gibt's ein Verzeichnis public_html (***-SuSE), das man per
Apache mit http://localhost/~awiese.mephisto ansprechen kann. Da liegt meine
Homepage drin, genauso wie auf dem T-Online-Webserver.
Wenn ich jetzt per 'root' zu awiese.mephisto werden will laeuft das etwa so:

$ root -lu awiese.mephisto -s /bin/bash

oder

$ + -lu awiese.mephisto -s /bin/bash

oder

$ +awiese -l -s /bin/bash

Ich koennte mir jetzt in einer netten Konfigurationsdatei auch ein paar Aliase
anlegen:

z.B.

awiese:~> cat ~/.root.popt
root alias --am -lu awiese.mephisto -s /bin/bash
+ alias --am -lu awiese.mephisto -s /bin/bash
awiese:~> + --am
awiese.mephisto:~>

ist schon etwas einfacher. Aber das Programm mag ja eh keiner ;)

>
> Ich setze getopt_long einfach vorraus (mit dem Check mit configure). Punkt.
> Allerdings ist getopt_long beim einlesen der Optionen auch nicht
> fehlerfrei, besonders wenn ein Parameter ein _optionales_ Argument hat geht
> zwar ein (--foo = -f)
> myprog --foo arg
> und
> myprog -farg
> aber nicht:
> myprog -f arg

^^^^^^
Ja. Das ist mir auch schon aufgefallen.

> Dumm wenn jetzt -a, -r und -g auch mögliche Parameter sein können. Und ja,

Auch richtig.

> das ist hier (Linux):
> $ /lib/libc.so.6
> GNU C Library stable release version 2.2.5

Nebensaechliche Frage:

$ /lib/libc.so.6
GNU C Library stable release version 2.2.4, by Roland McGrath et al.
Copyright (C) 1992-1999, 2000, 2001 Free Software Foundation, Inc.
[...]
$ /lib/libncurses.so.5
Segmentation Fault
$

Warum?

> sehr reproduzierbar. Mit vorgeschriebenen Argument für den Parameter gibts
> das Problem nicht.
> Hab dazu noch keine Lösung gefunden. Wenn jemand eine weiß, währe ich
> äußerst dankbar.
>

libpopt macht's vielleicht richtig ;P
SCNR

> HS

Andreas Wiese

unread,
May 11, 2002, 1:59:08 PM5/11/02
to
Andreas Wiese <awiese....@t-online.de> dicebat:
[snip... Wie libpopt POSIX-korrekt einsetzen?]

Ich hab's gefunden: man uebergibt poptGetContext() als flag einfach
'POPT_CONTEXT_POSIXMEHARDER'. Ist im Herold noch nicht dokumentiert, ein
'grep' in popt.h nach POSIX half aber ;)

Felix von Leitner

unread,
May 11, 2002, 1:36:43 PM5/11/02
to
Thus spake Andreas Wiese (awiese....@t-online.de):
> Hab ich ja bis jetzt gemacht (getopt() oder getopt_long(), je nach
> Vorhandensein). Ich habe mir jetzt aber von Herold
> 'Linux/UNIX-Systemprogrammierung' gekauft und da steht neben getopt() und
> getopt_long() auch libpopt drin. Ich wollt's mal ausprobieren. Ausserdem
> fand ich's interessant, dass man - will man das - nur einmal
> poptGetNextOpt() aufrufen muss um die gesammte Kommandozeile abzuarbeiten
> und Optionsargumente werden gleich da gespeichert, wo sie hin sollen. Was
> IMHO am interessantesten ist, ist auch noch das Options-Aliasing.

Das getopt-Konzept nennt man "Iterator" und es ist dank OO gerade
tierisch im Kommen. getopt liegt also voll im Trend. ;)

> Was die Standardisierung betrifft: im Herold steht 'Das Softwarepaket popt
> [...] sollte auf jedem System verwendet werden koennen, das sich an den
> POSIX-Standard haelt'. Das ist ja AFAIK bei getopt_long() nicht der Fall.
> Hups... Wie ich gerade festellen muss, besitzt mein (VMware- ;) FreeBSD
> weder getopt_long() noch libpopt.

Das ist ja grotesk! Herold also, ja? Das Buch ist offensichtlich
komplett für die Tonne. popt ist eine proprietäre RedHat-"Innovation",
das die Funktionalität von getopt inkompatibel, langsam, bloatig und
nicht standardisiert nachimplementiert. getopt und getopt_long sind
Teil der Single Unix Specification.

Felix

Andreas Wiese

unread,
May 11, 2002, 3:17:19 PM5/11/02
to
Felix von Leitner <usenet-...@fefe.de> dicebat:
> Thus spake Andreas Wiese (awiese....@t-online.de):
>> Hab ich ja bis jetzt gemacht (getopt() oder getopt_long(), je nach
>> Vorhandensein). Ich habe mir jetzt aber von Herold
>> 'Linux/UNIX-Systemprogrammierung' gekauft und da steht neben getopt() und
>> getopt_long() auch libpopt drin. Ich wollt's mal ausprobieren. Ausserdem
>> fand ich's interessant, dass man - will man das - nur einmal
>> poptGetNextOpt() aufrufen muss um die gesammte Kommandozeile abzuarbeiten
>> und Optionsargumente werden gleich da gespeichert, wo sie hin sollen. Was
>> IMHO am interessantesten ist, ist auch noch das Options-Aliasing.
>
> Das getopt-Konzept nennt man "Iterator" und es ist dank OO gerade
> tierisch im Kommen. getopt liegt also voll im Trend. ;)
>

Wie auch schon erwaehnt - ich wollte libpopt einfach mal ausprobieren. Fuer
mein root-Programm, dass du ueberhaupt nicht leiden kannst ;) Aber ich
denke, die BufferOverflows sind eliminiert :) Oder? Ich erinnere mich da
dunkel an was, was in der letzten (nicht veroeffentlichten) Version entfernt
habe *grueble*... hm.

>> Was die Standardisierung betrifft: im Herold steht 'Das Softwarepaket popt
>> [...] sollte auf jedem System verwendet werden koennen, das sich an den

^^^^^ [1]


>> POSIX-Standard haelt'. Das ist ja AFAIK bei getopt_long() nicht der Fall.
>> Hups... Wie ich gerade festellen muss, besitzt mein (VMware- ;) FreeBSD
>> weder getopt_long() noch libpopt.
>
> Das ist ja grotesk! Herold also, ja? Das Buch ist offensichtlich
> komplett für die Tonne. popt ist eine proprietäre RedHat-"Innovation",
> das die Funktionalität von getopt inkompatibel, langsam, bloatig und
> nicht standardisiert nachimplementiert. getopt und getopt_long sind
> Teil der Single Unix Specification.
>

An sich ist das Buch nicht schlecht. In den Amazon-Buchkritiken sprechen sie
zwar alle von 'ner halbherzigen Stevens-Kopie, aber naja. Da ich Stevens bis
jetzt nirgendwo gefunden habe, ist's ja ganz gut ;)
Bei [1] stand in Klammern eine Internetadresse, wo man sich das Ding
runterladen kann - bei redhat.com. Hab mich schon gewundert...
Naja, dass es getopt_long() (wenn man das will) bei (Free)BSD doch gibt, hat
man mir ja nun gesagt.

> Felix

Einen schoenen Abend noch.

Gunnar Ritter

unread,
May 11, 2002, 10:17:25 PM5/11/02
to
Felix von Leitner <usenet-...@fefe.de> wrote:

> getopt und getopt_long sind Teil der Single Unix Specification.

Bist Du besoffen? getopt_long() ist doch kein Standard. Das
ist proprietärer GNU-Kram. Wer sowas einsetzen will, soll es
bitte in den Quellen mitliefern.

Gunnar

--
http://omnibus.ruf.uni-freiburg.de/~gritter/usenet.html

Felix von Leitner

unread,
May 12, 2002, 5:06:01 PM5/12/02
to
Thus spake Gunnar Ritter (g...@bigfoot.de):

> > getopt und getopt_long sind Teil der Single Unix Specification.
> Bist Du besoffen? getopt_long() ist doch kein Standard. Das
> ist proprietärer GNU-Kram. Wer sowas einsetzen will, soll es
> bitte in den Quellen mitliefern.

ACK, ich bin offenbar gerade besoffen. Ich ziehe alles zurück und
behaupte das Gegenteil.

getopt_long ist nicht susv2. Allerdings ist es sowohl bei Linux als
auch bei *BSD in der Standard-libc. Und bei FreeDOS ;)

Felix

Christian Weisgerber

unread,
May 13, 2002, 6:46:11 AM5/13/02
to
Felix von Leitner <usenet-...@fefe.de> wrote:

> getopt_long ist nicht susv2. Allerdings ist es sowohl bei Linux als
> auch bei *BSD in der Standard-libc. Und bei FreeDOS ;)

getopt_long() ist bei FreeBSD und OpenBSD nicht in der libc.
NetBSD hat es seit 1.5.

--
Christian "naddy" Weisgerber na...@mips.inka.de

Andi Kübler

unread,
May 14, 2002, 10:38:42 AM5/14/02
to
On Sun, 12 May 2002 23:06:01 BST, Felix von Leitner <usenet-...@fefe.de>
wrote:

> Thus spake Gunnar Ritter (g...@bigfoot.de):
>> > getopt und getopt_long sind Teil der Single Unix Specification.
>> Bist Du besoffen? getopt_long() ist doch kein Standard. Das
>> ist proprietärer GNU-Kram. Wer sowas einsetzen will, soll es
>> bitte in den Quellen mitliefern.
>
> ACK, ich bin offenbar gerade besoffen. Ich ziehe alles zurück und
> behaupte das Gegenteil.
>
> getopt_long ist nicht susv2.

zu deiner Beruhigung: susv3 auch nicht

Andi

0 new messages