/** * Eugene Marinelli * 18-549 - Healthnet * 2/22/08 * * Gumstix->PC upload server. * * Based on http://cs.baylor.edu/~donahoo/practical/CSockets/textcode.html */ #include #include #include #include #include #include #include #include #define MAXPENDING 5 static int servSock; static int clntSock; static sqlite3* db_conn; static void exit_handler(int x) { if (db_conn) { sqlite3_close(db_conn); } if (servSock) { close(servSock); } if (clntSock) { close(clntSock); } exit(1); } static int db_select_callback(void* client_socket, int num_cols, char** results, char** colnames) { int sock = (int)client_socket; char buf[80] = ""; int i; for (i = 0; i < num_cols; i++) { strcat(buf, results[i]); if (i < num_cols-1) { strcat(buf, ","); } } strcat(buf, ";"); if (send(sock, buf, strlen(buf), 0) == -1) { perror("send"); return -1; } else { return 0; } } int main(int argc, char *argv[]) { signal(SIGINT, exit_handler); if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } unsigned short echoServPort = atoi(argv[1]); char* db_filename = argv[2]; if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket"); exit(1); } struct sockaddr_in echoServAddr; memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); echoServAddr.sin_port = htons(echoServPort); if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) { perror("bind"); exit(1); } if (listen(servSock, MAXPENDING) < 0) { perror("listen"); exit(1); } // Initialize database. int ret; if ((ret = sqlite3_open(db_filename, &db_conn)) != SQLITE_OK) { fprintf(stderr, "sqlite3_open failed: error code %d\n", ret); } while (1) { struct sockaddr_in echoClntAddr; unsigned clntLen = sizeof(echoClntAddr); /* Wait for client connection. */ if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) { printf("accept() failed\n"); exit(1); } fprintf(stderr, "Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); fprintf(stderr, "Loading data from database %s...\n", db_filename); // int bytes_recv = recv(clntSock, buf, 80, 0); // printf("%d bytes received\n", bytes_recv); printf("Querying and uploading data...\n"); /* Callback writes results to client socket. */ char err_buf[80]; int ret = sqlite3_exec(db_conn, "select * from bodystats", db_select_callback, (void*)clntSock, (char**)&err_buf); if (ret != SQLITE_OK) { fprintf(stderr, "sqlite3_exec failed: %s\n", err_buf); exit_handler(1); } printf("Data uploaded.\n"); if (close(clntSock) == -1) { perror("close"); exit_handler(1); } } }