예제 #1
0
void create_database(MYSQL *conn, gchar *database){

	gchar* query = NULL;

	if((db == NULL && source_db == NULL) || (db != NULL && source_db != NULL && !g_ascii_strcasecmp(db, source_db))){
		const gchar* filename= g_strdup_printf("%s-schema-create.sql", db ? db : database);
		const gchar* filenamegz= g_strdup_printf("%s-schema-create.sql.gz", db ? db : database);
		const gchar* filepath= g_strdup_printf("%s/%s-schema-create.sql", directory, db ? db : database);
		const gchar* filepathgz= g_strdup_printf("%s/%s-schema-create.sql.gz", directory, db ? db : database);

		if (g_file_test (filepath, G_FILE_TEST_EXISTS)){
			restore_data(conn, database, NULL, filename, TRUE, FALSE);
		}else if (g_file_test (filepathgz, G_FILE_TEST_EXISTS)){
			restore_data(conn, database, NULL, filenamegz, TRUE, FALSE);
		}else{
			query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database);
			mysql_query(conn, query);
		}
	}else{
		query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database);
		mysql_query(conn, query);
	}

	g_free(query);
	return;
}
예제 #2
0
void restore_schema_post(MYSQL *conn){
	GError *error= NULL;
	GDir* dir= g_dir_open(directory, 0, &error);
	gchar** split_file= NULL;
	gchar* database=NULL;
	//gchar* table=NULL;


	if (error) {
		g_critical("cannot open directory %s, %s\n", directory, error->message);
		errors++;
		return;
	}

	const gchar* filename= NULL;

	while((filename= g_dir_read_name(dir))) {
		if (!source_db || g_str_has_prefix(filename, source_db)){
			if (g_strrstr(filename, "-schema-post.sql")) {
				split_file= g_strsplit(filename, "-schema-post.sql", 0);
				database= split_file[0];
				//table= split_file[0]; //NULL
				g_message("Restoring routines and events for `%s`", db ? db : database);
				restore_data(conn, database, NULL, filename, TRUE, TRUE);
			}
		}
	}

	g_strfreev(split_file);
	g_dir_close(dir);
}
예제 #3
0
파일: myloader.c 프로젝트: bhyvex/shell
void *process_queue(struct thread_data *td) {
	struct configuration *conf= td->conf;
	g_mutex_lock(init_mutex);
	MYSQL *thrconn= mysql_init(NULL);
	g_mutex_unlock(init_mutex);

	mysql_options(thrconn, MYSQL_READ_DEFAULT_GROUP, "myloader");

	if (compress_protocol)
		mysql_options(thrconn, MYSQL_OPT_COMPRESS, NULL);

	if (!mysql_real_connect(thrconn, hostname, username, password, NULL, port, socket_path, 0)) {
		g_critical("Failed to connect to MySQL server: %s", mysql_error(thrconn));
		exit(EXIT_FAILURE);
	}

	if (!enable_binlog)
		mysql_query(thrconn, "SET SQL_LOG_BIN=0");

	mysql_query(thrconn, "/*!40101 SET NAMES binary*/");
	mysql_query(thrconn, "SET autocommit=0");

	g_async_queue_push(conf->ready, GINT_TO_POINTER(1));

	struct job* job= NULL;
	struct restore_job* rj= NULL;
	for(;;) {
		job= (struct job*)g_async_queue_pop(conf->queue);

		switch (job->type) {
			case JOB_RESTORE:
				rj= (struct restore_job *)job->job_data;
				g_message("Thread %d restoring `%s`.`%s` part %d", td->thread_id, rj->database, rj->table, rj->part);
				restore_data(thrconn, rj->database, rj->table, rj->filename, FALSE);
				if (rj->database) g_free(rj->database);
                                if (rj->table) g_free(rj->table);
                                if (rj->filename) g_free(rj->filename);
                                g_free(rj);
                                g_free(job);
                                break;
			case JOB_SHUTDOWN:
				g_message("Thread %d shutting down", td->thread_id);
				if (thrconn)
					mysql_close(thrconn);
				g_free(job);
				mysql_thread_end();
				return NULL;
				break;
			default:
				g_critical("Something very bad happened!");
				exit(EXIT_FAILURE);
		}
	}
	if (thrconn)
		mysql_close(thrconn);
	mysql_thread_end();
	return NULL;
}
예제 #4
0
파일: main.c 프로젝트: RunnerL/Farsight_SXT
void system_init(void)
{
#if defined(EEPROM)
  //检测24cxx存储芯片是否正常
  while (at24xx_check()){
#if defined (BEEP)
    //蜂鸣器响
    BEEP_TOGGLE();
#endif
#if defined (DEBUG)
    send_data(DEBUG_UART, "24cxx check fail!!\r\n", strlen("24cxx check fail!!\r\n"));
#endif
    Delay(100);
  }
  //恢复数据
  restore_data();
#endif
}
예제 #5
0
/*
** prototype function to be executed by  the thread,
** This will handle connection for each client.
*/
void *connection_handler(void *socket_desc) {
    //Get the socket descriptor
    int i;
    int sock = *(int*)socket_desc;
    int read_size;
    unsigned char client_message[SOCK_BUF_SIZE];
    unsigned char *temp;
	
    while( (read_size = recv(sock , client_message , SOCK_BUF_SIZE , 0)) > 0 ) {
        client_message[read_size] = '\0';
		
		temp = stringProcess(client_message,&read_size);
		if(read_size >= 8 && temp != NULL){
			restore_data(temp,read_size);
            #ifdef DEBUG_TIME
				printf("Received Valid String:%s \n",client_message);
            #endif
			//*(client_message) = '\0';
		}
		else {
            #ifdef DEBUG_TIME
    			printf("Invalid string:");
    			for(i = 0;*(client_message + i) != '\0';++i) {
    				printf("%x ",*(client_message + i));
    			}
    			printf("\n");
            #endif
			//*(client_message) = '\0';
		}
        read_size = 0;//clear read size
    }
     
    if(read_size == 0) {
        puts("Client disconnected");
        fflush(stdout);
    } else if(read_size == -1) {
        perror("recv failed");
    }
         
    //Free the socket pointer
    free(socket_desc);
	return 0;
}
예제 #6
0
파일: myloader.c 프로젝트: bhyvex/shell
void add_schema(const gchar* filename, MYSQL *conn) {
	// 0 is database, 1 is table with -schema on the end
	gchar** split_file= g_strsplit(filename, ".", 0);
	gchar* database= split_file[0];
	// Remove the -schema from the table name
	gchar** split_table= g_strsplit(split_file[1], "-", 0);
	gchar* table= split_table[0];

	gchar* query= g_strdup_printf("SHOW CREATE DATABASE `%s`", db ? db : database);
	if (mysql_query(conn, query)) {
		g_free(query);
		g_message("Creating database `%s`", db ? db : database);
                query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database);
                mysql_query(conn, query);
	} else {
		MYSQL_RES *result= mysql_store_result(conn);
		// In drizzle the query succeeds with no rows
		my_ulonglong row_count= mysql_num_rows(result);
		mysql_free_result(result);
		if (row_count == 0) {
			// TODO: Move this to a function, it is the same as above
			g_free(query);
			g_message("Creating database `%s`", db ? db : database);
			query= g_strdup_printf("CREATE DATABASE `%s`", db ? db : database);
			mysql_query(conn, query);
		}
	}
	g_free(query);

	if (overwrite_tables) {
		g_message("Dropping table (if exists) `%s`.`%s`", db ? db : database, table);
		query= g_strdup_printf("DROP TABLE IF EXISTS `%s`.`%s`", db ? db : database, table);
		mysql_query(conn, query);
		g_free(query);
	}

	g_message("Creating table `%s`.`%s`", db ? db : database, table);
	restore_data(conn, database, table, filename, TRUE);
	g_strfreev(split_table);
	g_strfreev(split_file);
	return;
}
예제 #7
0
파일: srt_server.c 프로젝트: alonbee/Net
// This is a thread  started by srt_server_init(). It handles all the incoming 
// segments from the client. The design of seghanlder is an infinite loop that calls snp_recvseg(). If
// snp_recvseg() fails then the overlay connection is closed and the thread is terminated. Depending
// on the state of the connection when a segment is received  (based on the incoming segment) various
// actions are taken. See the client FSM for more details.
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
void* seghandler(void* arg)
{
  seg_t* seg = (seg_t*) malloc(sizeof(seg_t));
  seg_t* ack = (seg_t*) malloc(sizeof(seg_t));
  // memset(&seg, 0, sizeof(seg));
  svr_tcb_t* tp = (svr_tcb_t*) malloc(sizeof(svr_tcb_t));

  while (1) {
    // Find the right server
    tp = NULL;
    if (snp_recvseg(tcp_socknum,seg) != 1) {
        printf("Can't receive data in server, ready to close\n");
      	close(tcp_socknum);
        pthread_exit(NULL);
    }

    // Get socketfd by port
    int sockfd = -1;
    for (int i = 0; i < MAX_TRANSPORT_CONNECTIONS; ++i)
      {
        if (svr_tcb_table[i] != NULL && svr_tcb_table[i] -> svr_portNum == seg->header.dest_port) {
          // Get the right tcb based on dest port
            sockfd = i; /*get socket number in srt for client port*/
            // tp -> client_port = seg.header.src_port;
            tp = svr_tcb_table[i];
          }
        }

      printf("Server sockfd =%d,Received seg header type =%d\n",sockfd,seg->header.type);

      if (!tp){
      printf("Server: Can't get server_tcp for the seg\n");
      continue;
        }

      printf("seghandler sockfd=%d , state=%d \n", sockfd, tp->state);
    switch(tp->state) {
      case CLOSED:
          printf("Server: sockfd=%d received seg in CLOSED\n", sockfd);
        break;
      case LISTENING: {
        if(seg->header.type == SYN) {
          pthread_mutex_lock(tp -> bufMutex);
          tp->client_portNum = seg->header.src_port;
          tp->state=CONNECTED;
          printf("Server:sockfd = %d Got SYN from client\n", sockfd);
          
          // Set tcb expect_seqNum
          tp -> expect_seqNum = seg->header.seq_num;
          pthread_mutex_unlock(tp -> bufMutex);

          // memset(&ack,0, sizeof(ack));
          // Received SYN and send SYNACK back
          ack->header.type = SYNACK;
          ack->header.src_port = tp -> svr_portNum;
          ack->header.dest_port = tp -> client_portNum;
          ack->header.length = 0;
          snp_sendseg(tcp_socknum, ack);
          printf("Server:sockfd = %d Sent SYNACK to client\n", sockfd);
        }
        else
          printf("Server: Listening received SYN\n");
        break;
   	 }
      case CONNECTED: 
      {
        switch (seg->header.type) {
          printf("Server: tp %d: receive %d\n", sockfd, seg->header.type);
          case SYN:
          {
            // Received SYN and send SYNACK back
            // seg_t ack;
            // memset(&ack,0, sizeof(ack));
            pthread_mutex_lock(tp -> bufMutex);
          	tp -> expect_seqNum = seg->header.seq_num;
            pthread_mutex_unlock(tp -> bufMutex);

            ack->header.type = SYNACK;
            ack->header.src_port = tp -> svr_portNum;
            ack->header.dest_port = tp -> client_portNum;
            ack->header.length = 0;
            snp_sendseg(tcp_socknum, ack);
            break;            
          }
          case DATA: {
          	// tp -> expect_seqNum will be updated if right; Otherwise, same old expect_seqNum
          	if (seg -> header.seq_num == tp -> expect_seqNum){
          		// Update tp -> expect_seqNum and store data in tp -> recvBuf 
          		restore_data(tp, seg);
          	}
          		// Send ack back anayway
          		ack->header.type = DATAACK;
            	ack->header.src_port = tp -> svr_portNum;
            	ack->header.dest_port = tp -> client_portNum;
            	ack->header.length = 0;
            	ack->header.ack_num = tp -> expect_seqNum;  // Send the new expect_seqNum(added by data length) if the expect_seqNum is right 
            	snp_sendseg(tcp_socknum, ack);
         
          	break;
          }
          case FIN:
          {
            time_t timer = time(NULL);
            printf("Server: tp %d: receive FIN %s", sockfd, ctime(&timer));

            // send FINACK
            // seg_t ack;
            // memset(&ack,0, sizeof(ack));
            ack->header.type = FINACK;
            ack->header.src_port = tp -> svr_portNum;
            ack->header.dest_port = tp -> client_portNum;
            ack->header.length = 0;
            snp_sendseg(tcp_socknum, ack);

            tp->state = CLOSEWAIT;

            // start a thread for CLOSE_WAIT_TIMEOUT; If time expires, Set tp state as CLOSED  
            pthread_t closetimer;
            pthread_create(&closetimer,NULL,closewait, (void*)tp);
            break;                    
          }
          default:
            break;
          }
        break;
      }
      case CLOSEWAIT:
        // receive FIN
        if (seg->header.type == FIN) {

          // send FINACK
          // seg_t ack;
          // memset(&ack,0, sizeof(ack));
          ack->header.type = FINACK;
          ack->header.src_port = tp -> svr_portNum;
          ack->header.dest_port = tp -> client_portNum;
          ack->header.length = 0;
          snp_sendseg(tcp_socknum, ack);
          printf("Server: sent FINACK in closewait\n");
          }
        else {
          printf("Server: Received not fin in CLOSEWAIT\n");
        }
        break;
      default:
        printf("Server: sockfd= %d: wrong state\n", sockfd);
        break;
    }
  }
}
예제 #8
0
string finger_group(string group) {
    int i, j;
    string msg;
    object link;
    mixed tmp1, tmp2, tmp3, tmp4, tmp5;
    string *group2;

    groups = master()->query_groups();
    if (!group || undefinedp(groups[group]))
	return "Finger: There is no such group.\n";

    /*
     * special case: filter root members out of admin group
     */
    //    if (group == "admin")
    //        groups["admin"] = filter_array(groups["admin"], "filter_root", this_object());

    group2 = groups[group];
    j = group2 ? sizeof(group2) : 0;

    msg = LINE1;
    if (j == 0) {
	msg += "[" + capitalize(mud_name()) + "] No members of " +
	capitalize(group) + " group (" + ctime(time()) + ").\n";
    } else {
	msg += "[" + capitalize(mud_name()) + "] " + j +
	(j == 1 ? " user" : " users") + " " +
	"in " + capitalize(group) + " group (" + ctime(time()) + ").\n";
	msg += LINE2;
	msg += sprintf("%-12s%-20s%-14s%-28s", "Login", "Real Name",
	  "Domain", "On\n");
	msg += LINE2;
	group2 = sort_array(group2, "do_alpha", this_object());
	for (i = 0; i < j; i++) {
	    tmp1 = group2[i]; /* logid id */
	    link = find_player(tmp1);
	    if (link)
		link = link->query_link();
	    else
		link = restore_data(tmp1);
	    if (!link)
		continue; /* no such user */

	    tmp2 = (string)link->RNAME; /* real name */

	    tmp3 = DOMAIN_D->query_domain(link);
	    if ((tmp3 == 0) || (tmp3 == ""))
		tmp3 = "None";

	    tmp4 = find_player(tmp1);
	    if (!tmp4 || !filter_users(tmp4))
		tmp5 = "Last  ";
	    else
		tmp5 = "Since ";
	    if (!link->query("last_on"))
		tmp5 += "(Unavailable)";
	    else
		tmp5 += ctime((int)link->query("last_on"));

	    msg += sprintf("%-12s%-20s%-14s%28s",
	      capitalize((string)tmp1),
	      capitalize(extract((string)tmp2, 0, 18)),
	      capitalize((string)tmp3),
	      (string)tmp5 + "\n");

	    if (!find_player(tmp1)) {
		link->remove();
	    }
	}
    }

    return msg + LINE1;
}
예제 #9
0
string finger_user(string who) {
    object link, body;
    mixed tmp1, tmp2, tmp3, tmp4, tmp5;
    string msg;
    mapping mail_stat;
    int hibernate;

    link = restore_data(who);
    if (link) body = restore_body(who);

    if (!link || !body) {
	if (sscanf(who, "(%s)", who))
	    return finger_group(who);
	return "Finger: There is no such user.\n";
    }

    msg = LINE1;

    // Line 1: Fingerguy the Utter Novice (Chaotic Neutral)
    if (link->query("wizard")) {
	string al, title = body->getenv( "TITLE" );
	al = body->query("al_title");
	if (!al || al=="") {
	    msg += body->query_title() + "\n";
	} else {
	    if (!title) title = "$N the New Wizard ($A)";
	    title = replace_string(title, "$N", body->query("cap_name"));
	    title = replace_string(title, "$A", al);
	    msg += title + "\n";
	}
    } else
	msg += body->query_title() + "\n";

    // Line 2: Male Human Mage [Level 5]
    // or:    Male Human Necromancer [Lesser Power of Prime]
    msg += capitalize(body->query("gender"));
    msg += " "+capitalize(body->query("race"));

    mail_stat = link->query("Class");
    if (mail_stat) {
	tmp1 = (values(mail_stat))[0];
	msg += ( " " +  capitalize(tmp1) );
    }

    if (wizardp(TP)) {
	if (link->query("wizard")) {
	    if (member_group(body->query("name"), "ambassador")) {
		tmp1 = "Ambassador";
		tmp2 = body->query("ambassador");
		if ((tmp2 != 0) && (tmp2 != ""))
		    tmp1 = tmp1 + " of " + capitalize(tmp2);
	    } else {
		tmp1 = DOMAIN_D->query_domain(link);
		tmp2 = DOMAIN_D->query_domain_level(link);
		if ((tmp1 == 0) || (tmp1 == ""))
		    tmp1 = "Domainless "+tmp2;
		else
		    tmp1 = tmp2 + " of " + tmp1 + " Domain";
	    }
	} else {
	    tmp1 = "Level " + link->query("level");
	}
	tmp1 = " [" + tmp1 + "]\n";
	msg += tmp1;
    } else msg += "\n";

    // Line 3: Gang allegience: The Machiavellian Menagerie
    // or: The Admin (Leader)
    
	tmp1 = "Gang allegience: ";
	tmp2 = body->query("gang");

	if (tmp2) {
	    mail_stat = GANG_D->get_list_map();
	    if (mail_stat[tmp2] == body->query("name"))
	        tmp1 += "Leader of "+cap_all_words(tmp2);
	    else
	        tmp1 += "Member of "+cap_all_words(tmp2);
	       
	} else {
	    tmp1 += "none";
	}
	
   	msg += tmp1 + "\n";

    // Line 4 : Married to Whoever
    tmp1 = body->query("spouse");
    if (tmp1) {
	tmp1 = capitalize(tmp1);
	msg += "Married to "+tmp1+"\n";
    }

    // Line 5 : A cool line to make it all very pretty.
    msg += LINE2;

    // Line 6: In Real Life: Matthew A. Titmus
    // or: In Real Life: ?
    tmp2 = "In Real Life: ";
    if (tmp3 = (string)link->RNAME)
	tmp2 += extract(tmp3, 0, 22);
    else
	tmp2 += "?";

    msg += "Status: ";
    if (member_group(body->query("name"), "root"))
	msg += "Administrator\n";
    else if (member_group(body->query("name"), "adminaccess"))
	msg += "Elder\n";
    else if (member_group(body->query("name"), "ambassador"))
	msg += "Ambassador\n";
    else if (link->query("wizard"))
	msg += "Immortal\n";
    else
	msg += "Player\n";

    if (body->query("email_visible"))
	tmp1 = "[Public]";
    else
	tmp1 = "[Private]";

    if (adminp(TP) || 
      body->query("name")==TP->query("name")) {
	tmp1 = (string)link->query("email")+" "+tmp1;
    } else {
	if (body->query("email_visible")) {
	    tmp1 = (string)link->query("email");
	} else {
	    tmp1 = "[Private]";
	}
    }

    if (tmp1) msg += "Email address: " + tmp1 + "\n";

    tmp1 = (string)link->query("URL");
    if (tmp1) msg += "URL: " + tmp1 + "\n";

    hibernate = (int)link->query("hibernate");

    if (hibernate && time() < hibernate)
	msg += "\n\t[In hibernation until " + ctime(hibernate) + "]\n\n";

    tmp1 = find_player(who);
    if (tmp1) {
	if (!filter_users(tmp1))
	    tmp1 = 0;
    }

    if (!link->query("last_on"))
	msg += (tmp1 ? "On since: " : "Last on: ") + "Unavailable";
    else
	msg += ((tmp1 && !tmp1->query("npc")) ? "On since: " : "Last on: ") +
	ctime((int)link->query("last_on")) ;

    if (wizardp(TP)) 
	msg += ( " from " + (string)link->query("ip") + " \n" );
    else
	msg += "\n";

    if (tmp1) {
	tmp1 = query_idle_string(tmp1, 1);
	if (strlen(tmp1) > 0)
	    msg += tmp1 + "\n";
    }

    mail_stat = (mapping)MAILBOX_D->mail_status(who);
    if (mail_stat["unread"])
	msg += sprintf("%s has not read %d of their %d piece%s of mail.\n",
	  capitalize(who), mail_stat["unread"], mail_stat["total"],
	  (mail_stat["total"] == 1 ? "" : "s"));
    else {
	msg += "No unread mail" ;
	if(this_player()) {
	    if (adminp(getuid(this_player()))) {
		//  msg += " ("+mail_stat["total"]+" pieces)" ;
		msg += sprintf(" (%d piece%s)", mail_stat["total"], (mail_stat["total"] == 1 ? "" : "s"));
	    }
	}
	msg += ".\n" ;
    }

    if (link->query("wizard")) {
	tmp1 = user_path(who) + ".project";
	if (file_size(tmp1) >= 0)
	    msg += "Project: " + read_file(tmp1);

	tmp1 = user_path(who) + ".plan";
	if (file_size(tmp1) >= 0) {
	    msg += "Plan:\n" + read_file(tmp1);
	} else {
	    msg += "No Plan.\n";
	}
    } else {
	if (body->query("session"))
	    tmp1 = iwrap("Session: "+body->query("session"));
	else
	    tmp1 = "No Session.\n";

	msg += tmp1;
    }

    msg += LINE1;

    if (!find_player(who) || !interactive(find_player(who))) {
	link->remove();
	// Some names like .foo weren't getting away.
	if(link) destruct(link);
	if(link) log_file("fingerdest",sprintf("Connection of %s not "+
		"dested by finger daemon, on %s.\n", link->query("name"), 
		ctime(time())));

	if(body) destruct(body);
	if(body) log_file("fingerdest",sprintf("Connection of %s not "+
		"dested by finger daemon, on %s.\n", body->query("name"), 
		ctime(time())));
    }

    return "\n" + msg + "\n";
}