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