BhaaL
27-12-2004, 16:03
Hallo miteinander!
Ich bin vorhin auf einen äußerst komischen Fehler gestoßen, der scheinbar vom vsprintf produziert wird...
Ich bin grade dabei, IRC-Services zu schreiben, und beim Verbinden gibts immer wieder nette ASCII-Folgen zu sehen, die keinesfalls von der IRC-RFC her erlaubt sind.
-16:34:27- «BL» Join» [develServ] (v)ÐA@under.construction)
Der Nick "develServ" und der Host "under.construction" funktionieren, aber der Ident "v)ÐA" sollte "serv" sein. Der Realname - hier nicht zu sehen, sollte auch "Service under contruction" lauten, ist aber ebenso eine Kombination von ASCII-Zeichen, die nicht in meinem Code vorkommen.
Über mehrere Stufen hab ich den Weg von der initialisierung bis zum verbinden verfolgt, und bis zu meiner Funktion snd() sind die Strings auch vollkommen in Ordnung...
#include <stdarg.h>
typedef struct services_s {
char *servicenick;
char *servicehost;
char *serviceuser;
char *servicename;
} services_t;
/*
serv->servicenick="develServ";
serv->serviceuser="serv";
serv->servicehost="under.construction";
serv->servicename="Service under Construction";
*/
void connect_service(services_t *serv) {
//Hier sind alle Member von serv noch immer wie im obigen Kommentar
snd("NICK %s 1 %d %s %s %s %d :%s" ,serv->servicenick,time(),serv->serviceuser,serv->servicehost,me->servername,time(),serv->servicename);
snd("MODE %s +idqS",serv->servicenick);
}
void snd(char *fmt,...) {
va_list argptr;
char *snd=(char*)malloc(512);
va_start(argptr,fmt);
vsprintf(snd,fmt,argptr);
//Hier scheinbar nicht mehr. serv->serviceuser und serv->servicename sind kryptische Zeichen
va_end(argptr);
[...]
write(conn,snd,strlen(snd));
}
(Sollte mehr Code von Nöten sein, bitte Posten)
Der snd()-Code funktioniert sonst auch einwandfrei, mit Ausnahme eines weiteren Falles, wo es sogar zu einem Segmentation Fault kommt.
typedef struct server_s {
int link_numeric;
char *servername;
char *serverdesc;
} server_t;
int main (int argc, char *argv[]) {
[...]
server_t *me=(server_t*)malloc(sizeof(server_t));
me->link_numeric=123;
me->servername="dev.my.net";
me->serverdesc="MyNet Services - under Development";
[...]
snd("SERVER %s 1 %s %d J10 H]] +s :%s",me->servername,me->servername,time(),me->serverdesc);
[...]
}
Hier verabschiedet sich das Programm in der Funktion snd(), vermutlich auch beim vsprintf.
Hat jemand schon Probleme wie meins gesehen, und/oder kennt eine Lösung? Ein Code-Schnipsel mit einem varargs-Beispiel wär auch nicht schlecht (varargs.h)
Schon mal danke im Vorraus!
Greetz, BhaaL
Ich bin vorhin auf einen äußerst komischen Fehler gestoßen, der scheinbar vom vsprintf produziert wird...
Ich bin grade dabei, IRC-Services zu schreiben, und beim Verbinden gibts immer wieder nette ASCII-Folgen zu sehen, die keinesfalls von der IRC-RFC her erlaubt sind.
-16:34:27- «BL» Join» [develServ] (v)ÐA@under.construction)
Der Nick "develServ" und der Host "under.construction" funktionieren, aber der Ident "v)ÐA" sollte "serv" sein. Der Realname - hier nicht zu sehen, sollte auch "Service under contruction" lauten, ist aber ebenso eine Kombination von ASCII-Zeichen, die nicht in meinem Code vorkommen.
Über mehrere Stufen hab ich den Weg von der initialisierung bis zum verbinden verfolgt, und bis zu meiner Funktion snd() sind die Strings auch vollkommen in Ordnung...
#include <stdarg.h>
typedef struct services_s {
char *servicenick;
char *servicehost;
char *serviceuser;
char *servicename;
} services_t;
/*
serv->servicenick="develServ";
serv->serviceuser="serv";
serv->servicehost="under.construction";
serv->servicename="Service under Construction";
*/
void connect_service(services_t *serv) {
//Hier sind alle Member von serv noch immer wie im obigen Kommentar
snd("NICK %s 1 %d %s %s %s %d :%s" ,serv->servicenick,time(),serv->serviceuser,serv->servicehost,me->servername,time(),serv->servicename);
snd("MODE %s +idqS",serv->servicenick);
}
void snd(char *fmt,...) {
va_list argptr;
char *snd=(char*)malloc(512);
va_start(argptr,fmt);
vsprintf(snd,fmt,argptr);
//Hier scheinbar nicht mehr. serv->serviceuser und serv->servicename sind kryptische Zeichen
va_end(argptr);
[...]
write(conn,snd,strlen(snd));
}
(Sollte mehr Code von Nöten sein, bitte Posten)
Der snd()-Code funktioniert sonst auch einwandfrei, mit Ausnahme eines weiteren Falles, wo es sogar zu einem Segmentation Fault kommt.
typedef struct server_s {
int link_numeric;
char *servername;
char *serverdesc;
} server_t;
int main (int argc, char *argv[]) {
[...]
server_t *me=(server_t*)malloc(sizeof(server_t));
me->link_numeric=123;
me->servername="dev.my.net";
me->serverdesc="MyNet Services - under Development";
[...]
snd("SERVER %s 1 %s %d J10 H]] +s :%s",me->servername,me->servername,time(),me->serverdesc);
[...]
}
Hier verabschiedet sich das Programm in der Funktion snd(), vermutlich auch beim vsprintf.
Hat jemand schon Probleme wie meins gesehen, und/oder kennt eine Lösung? Ein Code-Schnipsel mit einem varargs-Beispiel wär auch nicht schlecht (varargs.h)
Schon mal danke im Vorraus!
Greetz, BhaaL