setstdio & makefile

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

setstdio & makefile
hi,

zur klausur 07/2003:

in der programmieraufgabe steht, dass einem eine funktion
void setstdio (int socket);
zur verfuegung steht, die std* auf den socket umleitet. man muss sie hier nicht selber programmieren, aber WIE ginge das denn, wenn man es sollte?

  1. frage zum makefile:
.PHONY: clean

CC = gcc
CFLAGS = -ansi -pedantic -Werror -Wall -D_POSIX_SOURCE -D_XOPEN_SOURCE=500

rshd: rshd.o setstdio.o
        $(CC) $(CFLAGS) -o rshd rshd.o setstdio.o

rshd.o: rshd.c
        $(CC) $(CFLAGS) -c -o rshd.o rshd.c
        
clean:
        rm -f rshd.o

muss man das CC und die CFLAGS vorher definieren, oder kann man einfach die in “make” eingebauten makros benutzen?


soweit ich mich an die übung erinner reicht sowas wie $(COMPILE) … aber ich würde es sicherheitshalber gcc $(CFLAGS) machen, die flags werden wir ja wohl nicht im kopf haben müssen


Makefile: in der Musterlösung werden gar keine CFLAGS verwendet aber das Makro $(CC), welches nicht selber definiert wird. Auf die Makros gab es ohnehin keine Punkte soweit ich weiss…

setstdio, ohne es ausprobiert zu haben denk mal etwa so

#include <unistd.h>

void setstdio (int socket) {
     dup2(socket, STDIN_FILENO);
     dup2(socket, STDOUT_FILENO);
}

oh, tatsaechlich so einfach?
nicht, dass ich das hingebracht haette, aber gut zu wissen.

das mit den makros ist auch praktisch, also benutze ich einfach $(CC), ohne es vorher zu definieren, und $(CFLAGS) gar nicht. sweet.


wie gesagt probiert hab ichs nicht aber ich denke das sollte funktionieren…

wie gesagt so ist es in der musterlösung ich kann dir nicht versprechen dass es in der echten klausur dann auch so ist g


wie gesagt probiert hab ichs nicht aber ich denke das sollte funktionieren…

so ist es in der musterlösung ich kann dir nicht versprechen dass es in der echten klausur dann auch so ist g


Mikey, der Meister der Zitate :smiley:


ups wie isn das passiert :smiley:


hi!

ich hab mir gedacht, um vor der klausur wieder in c reinzukommen, schreib ich mal jenes programm.
es funzt soweit, dass der befehl übertragen wird (das setstdio hab ich von mikey übernommen). allerdings kann der befehl nicht ausgeführt werden, da angeblich das prog nicht gefunden wird.
weiss jemand was da etz falsch is???


       case 0 :{
                int l;

                setstdio(fd);
                fclose(logfile);
                close(parentsock);

fprintf(stdout,"hello there!"); fflush(stdout);

                if (standardexec == NULL){

                        if ((standardexec = malloc(256 * sizeof(char))) == NULL){
                                perror("memory error");
                                EXITF;
                        }
                        if(fgets(standardexec, 256, stdin)==NULL){
                                perror("piping error");
                                EXITF;
                        }
                }

                l = strlen(standardexec);
                if (standardexec[l-1] =='\n') standardexec[l-1]= '\0';

fprintf (stderr, "exec");
fprintf(stderr,"-%s-\n", standardexec);
                execvp(standardexec, NULL);
                perror("execution error");
                fprintf(stderr,"exec_%s_\n",standardexec);
                EXITF;
        }

so sieht mein childcode aus.
noch was: die fprintf’s setzen das letzte zeichen immer an erste stelle.
wasn da falsch???


totaler schuss ins blaue: vielleicht darfst du dem execvp kein NULL als zweiten parameter übergeben. es erwartet ja ein char*-array, das etwa so aussehen sollte:

char *array[2];
array[0] = standardexec;
array[1] = NULL;

lass wissen obs daran lag…


ja in dem fall wäre ein execlp (standardexec,standardexec,NULL) wohl besser geeignet.


Ich hab grade rausgefunden, dass telnet für Newline anscheinend die Sequenz 13 (Carriage Return) und 10 (Linefeed) überträgt, ‘\n’ entspricht aber nur einem Linefeed (also 10). Das heisst Du hast nach dem fgets in Deinem Puffer auch noch das unerwünschte CR stehen und damit kommt das exec nicht klar. Also müsstest Du schon das CR mit \0 überschreiben (strlen-2)

hab schnell mal meine lösung hochgeladen aber bitte nicht als musterlösung betrachten ist wirklich nur schnell zusammengeflickt…
http://wwwcip.informatik.uni-erlangen.de/~simistil/rshd/


Hab zum makefile ne Frage.Und zwar sind da in den Prüfungen jeweils nur 5-6 Zeilen zur Verfügung.Kann da vielleicht jemand mal en Beispiel bringen wie das ausschauen muss.Denn Die Makefiles die hier überall sind , sind ja viel zu lang.


für rshd reicht

rshd: rshd.c setstdio.o
    gcc -o rshd rshd.c setstdio.o

clean:
    rm -f rshd

es gab 2 Pkt auf Abhängigkeiten, 3 Pkt auf das Kommando, 1 Punkt auf das clean


[quote=Mikey:1077125570] in der Musterlösung werden gar keine CFLAGS verwendet
[/quote]

Heißt das, dass es doch Musterlösungen gibt, wenigstens für die hier angesprochene Klausur? Wenn ja, wo?


nicht öffentlich :*)


Und normalerweise noch das Install, Uninstall!???


ah das wuerde auch die komische verschiebung bei der rueckgabe ueber telnet erklären… muss gleich mal ausprobiern danke schommal


wenn in der aufgabenstellung nichts davon steht dann nicht. auch das clean target hab ich nur drin weil es explizit verlangt war