02. februar 2006 - 20:27
Der er
10 kommentarer og
1 løsning
Segmentation fault. core dumped ved mysql udtræk.
MYSQL_ROW urow;
urow = fetch_sql(sql_cmd);
dette virker første gang, men anden gang funktionen bliver kaldt, crasher programmet.
Jeg er lidt lost, hvad kan jeg gøre?
gdb fortæller:
(gdb) where
#0 0x0804bc4e in simple_command ()
#1 0x0804db8a in mysql_real_query ()
#2 0x0804d9bf in mysql_send_query ()
#3 0x0804ae2f in fetch_sql (
buffer=0x8898000 "SELECT userPass, userId FROM lamusers WHERE userNick='test'") at lamserv.c:617
#4 0x0804a559 in login (nick=0x88890e0 "Zhooter", pass=0x8889100 "test", fd=6)
at lamserv.c:472
#5 0x0804b1ac in handleMsg (fd=6, nbytes=4) at lamserv.c:670
#6 0x0804b7c0 in main () at lamserv.c:1019
06. februar 2006 - 22:41
#2
//Logs a user in
int login(char *nick, char *pass, int fd)
{
MYSQL_ROW urow;
MYSQL_ROW srow;
MYSQL_ROW prow;
char *output;
char *sql_cmd;
sql_cmd = (char *) malloc(5000);
output = (char *) malloc(5000);
sprintf(sql_cmd, "SELECT userPass, userId FROM lamusers WHERE userNick='%s'", nick);
urow = fetch_sql(sql_cmd); //Det er her den fejler efter anden bruger kalder login funktionen.
if( urow )
{
if( strcmp(urow[0], pass) == 0 )
{
time_t login_time = time(NULL);
strcpy(user[fd].login_nick, nick);
strcpy(user[fd].nick, nick);
user[fd].fd = fd;
user[fd].user_id = atoi(urow[1]);
user[fd].mode = 1;
user[fd].logintime = login_time;
sprintf(sql_cmd, "SELECT ikon, commands, fontColor, fontFace, seeColors, awayMsg, isHidden FROM lamchatsettings WHERE userId='%d'", user[fd].user_id);
srow = fetch_sql(sql_cmd);
strcpy(user[fd].ikon, srow[0]);
strcpy(user[fd].flags, srow[1]);
strcpy(user[fd].fontColor, srow[2]);
strcpy(user[fd].fontFace, srow[3]);
user[fd].seeColors = atoi(srow[4]);
strcpy(user[fd].awaymsg, srow[5]);
user[fd].hidden = atoi(srow[6]);
sprintf(sql_cmd, "SELECT inRoom FROM lamchatsessions WHERE userId='%d'", user[fd].user_id);
prow = fetch_sql(sql_cmd);
user[fd].room_id = atoi(prow[0]);
sprintf(sql_cmd, "UPDATE lamchatsessions SET cid='%d' where userId='%d'", user[fd].fd, user[fd].user_id);
do_sql(sql_cmd);
sendToOne("#SVRR\r\n", fd);
remove_user(user[fd].user_id, fd);
initNum();
sendWelcomeMsg(fd);
sprintf(output, "#TOPI %s\r\n", room[user[fd].room_id].topic);
sendToOne(output, fd);
sprintf(output, "#ROOM %s\r\n", room[user[fd].room_id].roomname);
sendToOne(output, fd);
sprintf(output, "Du chatter nu i <b>%s</b> (%i/%i)", room[user[fd].room_id].roomname, room[user[fd].room_id].numusers, room[user[fd].room_id].maxusers);
write_private_system(output, fd);
if ( user[fd].hidden == 0 )
{
sprintf(output, "<b>%s</b> loggede ind kl. %s", user[fd].nick, time_make(1));
write_system(output, user[fd].room_id);
}
}
else
{
sendToOne("#ERRO Forkert Kodeord!\r\n", fd);
}
}
else
{
sendToOne("#ERRO Forkert NickName!\r\n", fd);
}
free(output);
free(sql_cmd);
}
06. februar 2006 - 23:27
#4
//Fetches a mysql-row
MYSQL_ROW fetch_sql(char buffer[300])
{
MYSQL_RES *result;
MYSQL_ROW row;
int num_fields;
mysql_query(mysql_handle, buffer);
if(mysql_error(mysql_handle)[0] != '\0') {
printf("%s\n", mysql_error(mysql_handle));
}
result = mysql_store_result(mysql_handle);
num_fields = mysql_num_fields(result);
row = mysql_fetch_row(result);
return row;
}
06. februar 2006 - 23:57
#7
//Fetches a mysql-row
MYSQL_ROW fetch_sql(char buffer[300])
{
MYSQL_RES *result;
MYSQL_ROW row;
int num_fields;
mysql_query(mysql_handle, buffer);
if(mysql_error(mysql_handle)[0] != '\0') {
printf("%s\n", mysql_error(mysql_handle));
}
result = mysql_store_result(mysql_handle);
num_fields = mysql_num_fields(result);
row = mysql_fetch_row(result);
mysql_free_result(result);
return row;
}
har prøvet dette uden held