Anzeige:
Seite 3 von 3 ErsteErste 123
Ergebnis 31 bis 43 von 43

Thema: GNU Readline & Telnet Client & Pseudo Terminal

  1. #31
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Welche Datei/Socket ist denn unter Handle 45 zu erreichen, und welche unter 40? Mir kommt es etwas spanisch vor, dass das meiste an 45 gesendet wird, und nur das \r an 40.
    Hängt vielleicht mit deiner Methode zusammen, den Socket nochmal auf ein Pseudo-TTY umzuleiten. Schau im trace doch mal nach, welche Aufrufe von open 40 und 45 zurückgeben (achte darauf, dass du die letzten nimmst, die Handles werden wiederverwendet)

  2. #32
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Also 40 ist die Master Seite des Pseudo-Terminals, also die Seite, die Readline als Standard Terminal bekommt. 45 ist der FD des Client Socket (der von accept zurück geliefert wird).



    hmpf... also es scheint so, als sei ein "rl_redisplay", das ich da wohl irgendwann mal in einem Anflug von Wahnsinn ans Ende der Ausgabefunktion geschrieben habe, für den Absturz verantwortlich. Hab's entfernt und jetzt bleibt das Programm auch nicht mehr stehen, wenn ich 'ne Kommandozeile aus der History verändert zurück schicke. Auf sowas muss man erstmal kommen...




    Ich danke dir ganz herzlich für deine Unterstützung! Könnte nicht abschätzen, wie lange das noch gedauert hätte, ohne. Ich werde wieder auf diesen Thread zurück kommen, sollten noch weitere Probleme auftreten (was ich selbstverständlich nicht hoffen will).
    Geändert von 7.e.Q (10-08-2005 um 11:11 Uhr)

  3. #33
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Bitte, keine Ursache. Werde mir das Prögrammchen wohl mal anschauen, wenn es fertig ist.

  4. #34
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Kannst du gern tun, wenn ich meinem Chef beigebogen habe, daß das unter der GPL vertrieben werden muss. Aber ich glaube, du fällst aus den Latschen, wenn du meinen chaotischen Programmierstil siehst. Ich lerne noch, muss im Programm noch ordentlich aufräumen. Außerdem hab ich nicht studiert, sondern mir alles autodidaktisch beigebracht. Von daher ist mein Code natürlich nicht mit dem eines Dipl. Ing. mit Jahren Berufserfahrung zu vergleichen. Aber er funktioniert, frisst keinen Speicher und stürzt auch (hoffentlich) nicht mehr ab.

    Ich werd mich mal mit CVS (wie heißt der Nachfolger noch gleich?) auseinander setzen, daß ich das Programm dann damit pflegen kann. Außerdem muss ich mich auch noch mit automake und autoconf auseinander setzen, auf daß das Proggi ein vernünftiges GNU Installationsverfahren erhält. Momentan ist es noch mit einem selbstgebastelten Makefile versehen.

    Und zuguterletzt muss ich noch sagen, daß es sich um ein absolut proprietäres Programm handelt, das im Endeffekt nur fernwartbare Loader-Funktionalität für unsere Pseudo-Embedded Linux Systeme zur Verfügung stellt. Das einzig besondere daran ist die umfangreiche Remote-Konsole, wo ich inzwischen ultrastolz drauf bin, und welche ich sicher auch noch um einige Funktionen erweitern werde.

  5. #35
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von 7.e.Q
    Ich werd mich mal mit CVS (wie heißt der Nachfolger noch gleich?)
    Es gibt keinen offiziellen Nachfolger. Es gibt viele freie Version-Control-Systeme, die "besser" als CVS sind, da einige macken ausgemerzt wurden. Du meinst aber höchstwahrscheinlich Subversion (SVN), das wirklich nur CVS besser machen will. Es gibt natürlich noch Monotone, Arch, etc.
    Und ja, du willst mit SVN und nicht mit CVS arbeiten. Glaub mir
    Das einzig besondere daran ist die umfangreiche Remote-Konsole, wo ich inzwischen ultrastolz drauf bin, und welche ich sicher auch noch um einige Funktionen erweitern werde.
    Genau das will ich mir ja auch anschauen.

  6. #36
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Achso... ja denn schau ich mal, was sich da machen lässt. Aber wie gesagt, das Programm ist derart verstrickt und verknotet, daß ich da wahrscheinlich nach einem Monat Urlaub selber nicht mehr reinfinden würde. Jung und naiv wie ich war, als ich es begonnen hab, hab ich natürlich damals ohne zu dokumentieren einfach drauf los programmiert. *kopf->tisch* Auch wenn's gut läuft...

    Was die Versions-Kontroll-Systeme angeht, so war ich immer der Meinung, SVN sei der Nachfolger von CVS, hätte dieses abgelöst. Aber man lernt nie aus. Wir benutzen zur Zeit MKS (Source Integrity) und das ist - ehrlich gesagt - der letzte Müll, weil die Bedienoberfläche in Java programmiert wurde und daher zum flüssigen Arbeiten viel zu langsam, zu resourcenintensiv und zu instabil ist. Außerdem fehlt die Unterstützung der Mausrad (man muss immer von Hand scrollen, wie früher) und vieles mehr. Wir sehnen uns nach einem besseren System, sehen aber auch eine gewaltige Welle an Umstellungsaufwand auf uns zu rollen, wenn wir daran denken.

    Ich werde mir SVN mal anschauen.

  7. #37
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    So, also die Sourcen stehen jetzt komplett unter

    http://7eq.ath.cx/repos/ISTS%20TCP%20BIOS/

    zur Verfügung, wenn du da mal reinschauen willst. Aber fall nicht in Ohnmacht! Das Ding ist fast überhaupt nicht dokumentiert, jedenfalls sehr lückenhaft und inkonsequent. Viel Vergnügen!

    SVN ist cool!

    PS: Achtung! ./configure und so funktionieren da noch nicht. Hab mich dafür noch nicht intensiv genug mit automake/autoconf auseinander gesetzt. Zum Übersetzen einfach make eingeben. Eventuell noch den CC und PP im Makefile anpassen, weil's jetzt auf distcc steht... uiuiui... ich bezweifle, daß sich dieses Chaos auf einem anderen Rechner übersetzen lässt.
    Geändert von 7.e.Q (27-10-2005 um 12:21 Uhr)

  8. #38
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    ARGH! Wieso sagt mir denn keiner, daß mein Apache gar nicht läuft????? So kann man ja auf meine Sourcen gar nicht zugreifen. *hmpf* Naja, jetzt läuft er jedenfalls...

  9. #39
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von 7.e.Q
    PS: Achtung! ./configure und so funktionieren da noch nicht. Hab mich dafür noch nicht intensiv genug mit automake/autoconf auseinander gesetzt.
    Solange dein Programm nicht auf VMS und PDPs laufen soll, lass es auch besser.
    Arbeite dich lieber in SCons ein, das ist viel angenehmer und mächtiger und läuft auch unter Windows, Mac OS, etc.

    www.scons.org

  10. #40
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Zitat Zitat von Joghurt
    Solange dein Programm nicht auf VMS und PDPs laufen soll, lass es auch besser.
    Arbeite dich lieber in SCons ein, das ist viel angenehmer und mächtiger und läuft auch unter Windows, Mac OS, etc.

    www.scons.org
    Ui, muss ich mir mal anschauen. Klingt interessant. Auch schon etabliert soweit? Weil autoconf ja bisher Status Quo war/ist.

  11. #41
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Ja, autoconf ist noch weit verbreitet, und wird es wohl auch noch bleiben, wenn man für jede Erdenkliche Unixversion kompilieren möchte. Wenn du dich aber auf moderne Systeme beschränken kannst, ist SCons sicherlich die bessere Wahl, auch wenn es noch ein paar Macken hat. id Software setzt SCons jedenfalls schon seit längerer Zeit mit Erfolg ein.

    http://www.scons.org/cgi-bin/wiki/SconsProjects

  12. #42
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Du kennst dich mit SCons aus? Der Einstieg fällt nicht leicht. Ich müsste ja dann das jetzt schon vorhandene makefile nach SConstruct konvertieren. Welche Möglichkeiten habe ich da?

    EDIT: also ich hab da mal mit angefangen, sieht ja sehr interessant aus, und erscheint mir vom Konzept her auch einfacher, als make. Aber eine Frage kommt mir da in den Sinn... ich möchte meine .o Files woanders liegen haben, als meine .c/.cxx/.cpp Files, genaugenommen in einem Unterordner namens obj. Dazu gibt es ein Kapitel in der SCons Doku, welches irgendwas mit einem SConscript beschreibt. Aber das funktioniert so bei mir irgendwie nicht. Gibt's da 'ne andere Möglichkeit? Mein SConstruct sieht jetzt so aus:

    Code:
    daemon_env = Environment(CPPPATH=["./cg/"], CCFLAGS=["-DISTSBIOS", "-DNCURSES", "-Wall", "-g"])
    nodaemon_env = Environment(CPPPATH=["./cg/"], CCFLAGS=["-DISTSBIOS", "-DNCURSES", "-DNODAEMON", "-Wall", "-g"])
    
    all_list = Split("""main.cxx
    				PortToSlot.cxx
    				CBGInfo.cxx
    				curses.cxx
    				md5.cxx
    				CGProcess.cxx
    				CSysUnit.cxx
    				CSysUnit_2.cxx
    				CSysUnit_SF.cxx
    				Server.cxx
    				Client.cxx
    				File.cxx
    				CInfoServer.cxx
    				CBroadcastServer.cxx
    				StringFuncs.cxx
    				CUTAPipe.cxx
    				NTPDController.cxx
    				DateFunctions.cxx
    				TimeSync/Timer.cxx""")
    
    timesync_list = Split("""TimeSync/TimeSync.cxx
    				TimeSync/Timer.cxx
    				TimeSync/RoundTrip.cxx
    				TimeSync/main_timesync.cpp""")
    
    daemon_list = Split("""CMain.cxx""")
    
    idf_list =	Split("""idffile.cxx
    			util.c
    			bits.c
    			blockzip.c
    			deflate.c
    			inflate.c
    			trees.c
    			idfrec.cxx
    			omaincgx.c""")
    
    idf_objects = daemon_env.Object(idf_list)
    all_objects = daemon_env.Object(all_list)
    daemon_objects = daemon_env.Object(daemon_list)
    nodaemon_objects = nodaemon_env.Object("CMain_nd.o", "CMain.cxx")
    
    timesync_objects = daemon_env.Object(timesync_list)
    
    
    Program('ists_tcp', all_objects + daemon_objects + idf_objects, LIBS=['ncurses', 'panel', 'm', 'readline', 'history'])
    Program('ists_tcp_nd', all_objects + nodaemon_objects + idf_objects, LIBS=['ncurses', 'panel', 'm', 'readline', 'history'])
    Program('timesync', timesync_objects, LIBS=['ncurses', 'panel', 'm', 'readline', 'history'])
    im Vergleich zu meinem Makefile ein recht beachtlicher Fortschritt bezüglich Übersichtlichkeit:

    Code:
    CC=		distcc gcc
    PP=		distcc g++
    
    LFLAGS=		-lncurses -lpanel -lm -lreadline -lhistory
    
    CFLAGS=		-DISTSBIOS -DNCURSES -Wall -g -I./cg/
    
    DESTFILE			=	ists_tcp
    DESTFILE_NODAEMON	=	ists_tcp_nd
    DESTFILE_TIMESYNC   =   TimeSync/timesync
    
    LOFILES=
    
    OFILES=		obj/main.o \
    			obj/PortToSlot.o \
    			obj/CBGInfo.o \
    			obj/curses.o \
    			obj/md5.o \
    			obj/CGProcess.o \
    			obj/CSysUnit.o \
    			obj/CSysUnit_2.o \
    			obj/CSysUnit_SF.o \
    			obj/Server.o \
    			obj/Client.o \
    			obj/File.o \
    			obj/CInfoServer.o \
    			obj/CBroadcastServer.o \
    			obj/StringFuncs.o \
    			obj/CUTAPipe.o \
    			obj/NTPDController.o \
    			obj/DateFunctions.o \
    			obj/Timer.o
    
    
    OFILES_D=	$(OFILES) obj/CMain.o
    
    OFILES_ND=	$(OFILES) obj/CMain_nd.o
    
    OFILES_TS=  obj/TimeSync.o \
    			obj/Timer.o \
    			obj/RoundTrip.o \
    			obj/main_timesync.o
    
    FORIDF=		obj/idffile.o \
    			obj/util.o \
    			obj/bits.o \
    			obj/blockzip.o \
    			obj/deflate.o \
    			obj/inflate.o \
    			obj/trees.o \
    			obj/idfrec.o \
    			obj/omaincgx.o
    
    HFILES=	main.h NTPDController.h CGProcess.h CSysUnit.h Client.h File.h Server.h main.h CInfoServer.h defines.h curses.h md5.h CBroadcastServer.h CUTAPipe.h
    
    all:			$(DESTFILE) $(DESTFILE_NODAEMON) $(DESTFILE_TIMESYNC)
    
    $(DESTFILE):			obj $(OFILES_D) $(FORIDF)
    						$(PP) -o $(DESTFILE) $(LOFILES) $(CFLAGS) $(OFILES_D) $(FORIDF) $(LFLAGS) $(CONSOLE)
    
    $(DESTFILE_NODAEMON):	obj $(OFILES_ND) $(FORIDF)
    						$(PP) -o $(DESTFILE_NODAEMON) $(LOFILES) $(CFLAGS) $(OFILES_ND) $(FORIDF) $(LFLAGS) $(CONSOLE)
    
    $(DESTFILE_TIMESYNC):	obj $(OFILES_TS)
    						$(PP) -o $(DESTFILE_TIMESYNC) $(LOFILES) $(CFLAGS) $(OFILES_TS) $(LFLAGS) $(CONSOLE)
    
    obj:
    						- mkdir obj
    
    obj/TimeSync.o:			TimeSync/TimeSync.cxx TimeSync/Timer.h TimeSync/TimeSync.h TimeSync/RoundTrip.h TimeSync/main_timesync.h
    						$(PP) $(CFLAGS) -c TimeSync/TimeSync.cxx -o obj/TimeSync.o
    
    obj/Timer.o:			TimeSync/Timer.cxx TimeSync/Timer.h
    						$(PP) $(CFLAGS) -c TimeSync/Timer.cxx -o obj/Timer.o
    
    obj/RoundTrip.o:		TimeSync/RoundTrip.cxx TimeSync/RoundTrip.h
    						$(PP) $(CFLAGS) -c TimeSync/RoundTrip.cxx -o obj/RoundTrip.o
    
    obj/main_timesync.o:	TimeSync/main_timesync.cpp TimeSync/main_timesync.h
    						$(PP) $(CFLAGS) -c TimeSync/main_timesync.cpp -o obj/main_timesync.o -Wno-deprecated
    
    obj/CMain.o:			CMain.cxx main.h version.h
    						$(PP) $(CFLAGS) -c CMain.cxx -o obj/CMain.o
    
    obj/CMain_nd.o:			CMain.cxx main.h version.h
    						$(PP) -DNODAEMON $(CFLAGS) -c CMain.cxx -o obj/CMain_nd.o
    
    obj/StringFuncs.o:		StringFuncs.cxx StringFuncs.h
    						$(PP) $(CFLAGS) -c StringFuncs.cxx -o obj/StringFuncs.o
    
    obj/PortToSlot.o:   		PortToSlot.cxx PortToSlot.h
    						$(PP) $(CFLAGS) -c PortToSlot.cxx -o obj/PortToSlot.o
    
    obj/CBGInfo.o:			CBGInfo.cxx CBGInfo.h
    						$(PP) $(CFLAGS) -c CBGInfo.cxx -o obj/CBGInfo.o
    
    obj/curses.o:       		curses.cxx
    						$(PP) $(CFLAGS) -c curses.cxx -o obj/curses.o
    
    obj/md5.o:       		md5.cxx
    						$(PP) $(CFLAGS) -c md5.cxx -o obj/md5.o
    
    obj/CSysUnit.o:     		CSysUnit.cxx CSysUnit.h
    						$(PP) $(CFLAGS) -c CSysUnit.cxx -o obj/CSysUnit.o
    
    obj/CSysUnit_2.o:		CSysUnit_2.cxx CSysUnit.h
    						$(PP) $(CFLAGS) -c CSysUnit_2.cxx -o obj/CSysUnit_2.o
    
    obj/CSysUnit_SF.o:		CSysUnit_SF.cxx CSysUnit.h
    						$(PP) $(CFLAGS) -c CSysUnit_SF.cxx -o obj/CSysUnit_SF.o
    
    obj/CGProcess.o:		CGProcess.cxx CGProcess.h
    						$(PP) $(CFLAGS) -c CGProcess.cxx -o obj/CGProcess.o
    
    obj/NTPDController.o:		NTPDController.cxx NTPDController.h main.h
    						$(PP) $(CFLAGS) -c NTPDController.cxx -o obj/NTPDController.o
    
    obj/Server.o:			Server.cxx Server.h main.h socket.h
    						$(PP) $(CFLAGS) -c Server.cxx -o obj/Server.o
    
    obj/Client.o:			Client.cxx Client.h main.h socket.h
    						$(PP) $(CFLAGS) -c Client.cxx -o obj/Client.o
    
    obj/File.o:			File.cxx File.h
    						$(PP) $(CFLAGS) -c File.cxx -o obj/File.o
    
    obj/CInfoServer.o:		CInfoServer.cxx CInfoServer.h main.h version.h
    						$(PP) $(CFLAGS) -c CInfoServer.cxx -o obj/CInfoServer.o
    
    obj/CDumpServer.o:  		CDumpServer.cxx CDumpServer.h
    						$(PP) $(CFLAGS) -c CDumpServer.cxx -o obj/CDumpServer.o
    
    obj/CBroadcastServer.o:		CBroadcastServer.cxx CBroadcastServer.h
    						$(PP) $(CFLAGS) -c CBroadcastServer.cxx -o obj/CBroadcastServer.o
    
    obj/CUTAPipe.o: 		CUTAPipe.cxx CUTAPipe.h
    						$(PP) $(CFLAGS) -c CUTAPipe.cxx -o obj/CUTAPipe.o
    
    obj/DateFunctions.o:		DateFunctions.cxx DateFunctions.h
    						$(PP) $(CFLAGS) -c DateFunctions.cxx -o obj/DateFunctions.o
    
    obj/main.o:			main.cxx $(HFILES) version.h main.h
    						$(PP) $(CFLAGS) -c main.cxx -o obj/main.o
    
    
    # IDFFILE
    
    obj/idfrec.o:			idfrec.cxx idfrec.h
    						$(PP) $(CFLAGS) idfrec.cxx -c -o obj/idfrec.o
    
    obj/idffile.o:			idffile.cxx
    						$(PP) $(CFLAGS) idffile.cxx -c -o obj/idffile.o
    
    obj/schedule.o:			schedule.cxx
    						$(PP) $(CFLAGS) schedule.cxx -c -o obj/schedule.o
    
    obj/ciop__x_.o:			ciop__x_.cpp
    						$(PP) $(CFLAGS) ciop__x_.cpp -c -o obj/ciop__x_.o
    
    obj/opcb__x_.o:			opcb__x_.cpp
    						$(PP) $(CFLAGS) opcb__x_.cpp -c -o obj/opcb__x_.o
    
    obj/otim__x_.o:			otim__x_.cpp
    						$(CC) $(CFLAGS) otim__x_.cpp -c -o obj/otim__x_.o
    
    obj/omaincgx.o:			omaincgx.c
    						$(CC) $(CFLAGS) omaincgx.c -c -o obj/omaincgx.o
    
    obj/util.o:			util.c
    						$(CC) $(CFLAGS) util.c -c -o obj/util.o
    
    obj/bits.o:			bits.c
    						$(CC) $(CFLAGS) bits.c -c -o obj/bits.o
    
    obj/blockzip.o:			blockzip.c
    						$(CC) $(CFLAGS) blockzip.c -c -o obj/blockzip.o
    
    obj/deflate.o:			deflate.c
    						$(CC) $(CFLAGS) deflate.c -c -o obj/deflate.o
    
    obj/inflate.o:			inflate.c
    						$(CC) $(CFLAGS) inflate.c -c -o obj/inflate.o
    
    obj/trees.o:			trees.c
    						$(CC) $(CFLAGS) trees.c -c -o obj/trees.o
    
    
    
    mrproper:			clean cleanidf
    
    clean:
    						- rm $(OFILES) $(OFILES_D) $(OFILES_ND) $(OFILES_TS)
    
    cleanidf:
    						- rm $(FORIDF)
    
    install:
    						- killall -9 $(DESTFILE)
    						- killall -9 $(DESTFILE_NODAEMON)
    						- killall -9 ladesw.out
    						- strip --strip-all $(DESTFILE)
    						- cp $(DESTFILE) /bin
    						- strip --strip-all $(DESTFILE_NODAEMON)
    						- cp $(DESTFILE_NODAEMON) /bin
    
    cleanupcg:
    						- rm /var/ists/fs/* -r
    
    run:					$(DESTFILE)
    						$(DESTFILE)
    
    runnd:					$(DESTFILE_NODAEMON)
    						$(DESTFILE_NODAEMON)
    EDIT: Die URL hat sich ein klein wenig verändert, lautet nun so:
    http://7eq.ath.cx/repos/ISTS%20BIOS%20TCP/


    Btw: @Joghurt: das Telnet Terminal findest du übrigens in der Klasse CInfoServer.

    Fast alle Klassen sind als Singletons aufgebaut, da ich in meinem Programm von den meisten Objekten nur jeweils eine einzige programmglobale Instanz benötige.
    Geändert von 7.e.Q (10-11-2005 um 10:08 Uhr)

  13. #43
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von 7.e.Q
    Aber eine Frage kommt mir da in den Sinn... ich möchte meine .o Files woanders liegen haben, als meine .c/.cxx/.cpp Files, genaugenommen in einem Unterordner namens obj.
    Das geht natürlich mit einem SConscript, es geht aber auch so:
    Code:
    daemon_env.BuildDir("obj","#",duplicate=0)
    nodaemon_env.BuildDir("obj","#",duplicate=0)
    Vor den .Object Zeilen schreiben. Nun musst du noch zu allen Dateinamen das "obj/" voranstellen, oder es Python machen lassen, wenn du (wie ich) schreibfaul bist:
    Code:
    all_list = ["obj/" + x for x in all_list]
    timesync_list = ["obj/" + x for x in timesync_list]
    ...etc...
    Btw: @Joghurt: das Telnet Terminal findest du übrigens in der Klasse CInfoServer.
    Danke! Ich schau's mir bei Gelegenheit mal an.

    im Vergleich zu meinem Makefile ein recht beachtlicher Fortschritt bezüglich Übersichtlichkeit:
    Eben. SCons ist ziemlich gut. Es holt sogar automatisch die aktuelle Revision aus RCS, wenn eine Sourcedatei nicht exisitert. Für CVS kann man das auch einrichten, IIRC.
    Geändert von Joghurt (10-11-2005 um 18:37 Uhr)

Lesezeichen

Berechtigungen

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