int wolfInit(int argc, char *argvs[]) { puts("Wolf init."); initshm(); puts((char *)shm); newOmega(); return 0; }
int main(int argc, char *argv[]) { int retcode; LOG_TRACE(LOG_INFORMATIONAL, "\nServer started. Is now initializing the setup...\n"); signal(SIGINT, my_handler); LOG_TRACE(LOG_INFORMATIONAL, "Setting up the valid arguments..."); setValidServerArguments(); //setting up all valid arguments LOG_TRACE(LOG_INFORMATIONAL, "... Done\n"); retcode = setup_shm(); handle_error(retcode, "Shared Memory could not be created.\n", PROCESS_EXIT); char *shm_start = shmat(shm_id, NULL, 0); LOG_TRACE(LOG_INFORMATIONAL, "... Done\n"); /* init shared memory control*/ retcode = initshm(shm_start); handle_error(retcode, "Could not create Shared Memory Control Set...\n", PROCESS_EXIT); /* init struct for PThread handling Clients */ myPThreadStruct = (struct pthread_struct *) malloc(sizeof(struct pthread_struct)); myPThreadStruct->isLast = 1; myPThreadStruct->nextClient = myPThreadStruct; /* if no arguments is chosen, output the usage of the Server */ if (argc == 1) { usage(); exit(1); } /* if arguments are chosen, validate the arguments */ else { printf("Verify valid arguments ...\n"); initValidServerArguments(argc, argv); } /* if no port for the server was chosen, set it to default port = 7000 */ if (validArguments[1].isSet == 0) { printf("There was no argument for the Server-Port. It will no be set to default = 7000\n"); ServerPort = 7000; validArguments[1].isSet = 1; } retcode = setTCPServer(); handle_error(retcode, "TCP Server settings could not be established!\n", PROCESS_EXIT); ServerListen(); /* clean up shared memory */ cleanup(shm_id); }
void* video_detect(void) { char dev_name[] = "/dev/videoXX", *first = NULL; // Indicate that we support desktop capturing. postmessage(VIDEO_IN_DEVICE, STR_VIDEO_IN_DESKTOP, 0, (void*)1); #ifdef __APPLE__ #else int i; for(i = 0; i != 64; i++) { snprintf(dev_name + 10, sizeof(dev_name) - 10, "%i", i); struct stat st; if (-1 == stat(dev_name, &st)) { continue; //debug("Cannot identify '%s': %d, %s\n", dev_name, errno, strerror(errno)); //return 0; } if (!S_ISCHR(st.st_mode)) { continue; //debug("%s is no device\n", dev_name); //return 0; } void *p = malloc(sizeof(void*) + sizeof(dev_name)), *pp = p + sizeof(void*); memcpy(p, &pp, sizeof(void*)); memcpy(p + sizeof(void*), dev_name, sizeof(dev_name)); if(!first) { first = pp; postmessage(VIDEO_IN_DEVICE, UI_STRING_ID_INVALID, 1, p); } else { postmessage(VIDEO_IN_DEVICE, UI_STRING_ID_INVALID, 0, p); } } #endif initshm(); return first; }
uint16_t native_video_detect(void) { char dev_name[] = "/dev/videoXX", *first = NULL; uint16_t device_count = 1; /* start at 1 for the desktop input */ // Indicate that we support desktop capturing. utox_video_append_device((void *)1, 1, (void *)STR_VIDEO_IN_DESKTOP, 0); for (int i = 0; i != 64; i++) { /* TODO: magic numbers are bad mm'kay? */ snprintf(dev_name + 10, sizeof(dev_name) - 10, "%i", i); struct stat st; if (-1 == stat(dev_name, &st)) { continue; // LOG_TRACE("Video", "Cannot identify '%s': %d, %s" , dev_name, errno, strerror(errno)); // return 0; } if (!S_ISCHR(st.st_mode)) { continue; // LOG_TRACE("Video", "%s is no device" , dev_name); // return 0; } char *p = malloc(sizeof(void *) + sizeof(dev_name)), *pp = p + sizeof(void *); memcpy(p, &pp, sizeof(void *)); memcpy(p + sizeof(void *), dev_name, sizeof(dev_name)); if (!first) { first = pp; utox_video_append_device((void *)p, 0, p + sizeof(void *), 1); } else { utox_video_append_device((void *)p, 0, p + sizeof(void *), 0); } device_count++; } initshm(); return device_count; }
/** * Kommunikation mit dem Server * * sock: Socket des Servers * version: Version des Clients * game_id: Game ID des Spiels * pipeRead für die pipe */ int performConnection(char* version, char* game_id, SharedMem *shm, int pipeRead) { char* line = malloc(sizeof(char) * BUFFR); char clientMessage[BUFFR]; char* errorMessage; int sock; char pipe_read[PIPE_BUF]; // Temporärer Speicher für das Auslesen von Variablen aus den Serverantworten char* temp1 = malloc(sizeof(char) * 20); int temp2; int temp3; /* Flags zum eindeutigen Kommunikation mit Server */ // Flag mit Phase, in der wir uns befinden int phase = 0; // Flag ob Spielfeldshm schon erstellt wurde int shmflag = 0; Spielfeldshm* spielfeld = malloc(sizeof(Spielfeldshm)); int quitflag = 0; int spielfeldID; int shmSizefeld; sock = getSock(configstruct); while (1) { // Empfange Nachricht von Server getLine(sock, line); /* Routine zum Beenden */ if (exit_flag == 2) { // spielfeld entfernen + line, temp1 freigeben shmdt(spielfeld); free(line); free(temp1); return EXIT_FAILURE; } // Servernachricht verarbeiten // Switch zwischen positiver/negativer Server Antwort switch (line[0]) { // positive Antwort case '+': if (phase == 0) { /* Protokollphase Prolog */ if (strstr(line, "+ MNM Gameserver") != 0) { // sende Protocol Version sprintf(clientMessage, "%s %s\n", "VERSION", version); sendMessage(sock, clientMessage); // lese Serverversion ein + gebe diese aus sscanf(line, "%*s %*s %*s v%s", temp1); printf("\nServer Version %s\n", temp1); } else if (strstr(line, "+ Client version accepted") != 0) { // sende Game ID sprintf(clientMessage, "%s %s\n", "ID", game_id); sendMessage(sock, clientMessage); // gebe Info aus printf("Client Version %s akzeptiert\n", version); } else if (strstr(line, "+ PLAYING") != 0) { // sende Player sprintf(clientMessage, "%s\n", "PLAYER"); sendMessage(sock, clientMessage); // lese Gametyp ein + kontrolliere diesen sscanf(line, "%*s %*s %s", temp1); if (strstr(temp1, "NMMorris") == 0) { perror("\nFalscher Spieltyp"); return EXIT_FAILURE; } printf("Spieltyp %s akzeptiert\n\n", temp1); getLine(sock, line); // nächste Zeile // lese Spielname ein + gebe diesen aus + speichern in shm sscanf(line, "%*s %[^\n]s", temp1); printf("Spielname: %s\n", temp1); strncpy(shm->spielname, temp1, sizeof(shm->spielname)); } else if (strstr(line, "+ YOU") != 0) { // lese eigene Spielervariablen ein + gebe diese aus + speichern in shm sscanf(line, "%*s %*s %d %[^\n]s", &temp2, temp1); printf("Du (%s) bist Spieler #%d\n", temp1, temp2 + 1); // Spielernummer nur für die Ausgabe +1 -> Nummern 1-8 shm->eigspielernummer = temp2; if (shm->eigspielernummer < 0) { fprintf(stderr, "\nFehler beim Erfassen der Spielernummer: Spielernummer < 0\n"); return EXIT_FAILURE; } shm->spieleratt[shm->eigspielernummer].spielernummer = shm->eigspielernummer; strncpy(shm->spieleratt[shm->eigspielernummer].spielername, temp1, sizeof(shm->spieleratt[shm->eigspielernummer].spielername)); shm->spieleratt[shm->eigspielernummer].regflag = 1; getLine(sock, line); // nächste Zeile // lese Anzahl Spieler aus + speichern in shm sscanf(line, "%*s %*s %d", &temp2); shm->anzahlspieler = temp2; if (shm->anzahlspieler < 1) { fprintf(stderr, "\nFehler beim Erfassen der Spieleranzahl: Spieleranzahl < 1\n"); return EXIT_FAILURE; } else if (shm->anzahlspieler > 8) { fprintf(stderr, "\nFehler beim Erfassen der Spieleranzahl: Spieleranzahl > 8\n"); return EXIT_FAILURE; } getLine(sock, line); // nächste Zeile // lese Gegner-Spielervariablen ein + gebe diese aus + speichern in shm sscanf(line, "%*s %d", &temp2); temp1 = strndup(line + 4, strlen(line) - 6); temp3 = atoi(strndup(line + 5 + strlen(temp1), 1)); if (temp3 == 1) printf("Spieler #%d (%s) ist bereit\n\n", temp2 + 1, temp1); // Spielernummer nur für die Ausgabe +1 -> Nummern 1-8 else printf("Spieler #%d (%s) ist noch nicht bereit\n\n", temp2 + 1, temp1); // Spielernummer nur für die Ausgabe +1 -> Nummern 1-8 shm->spieleratt[temp2].spielernummer = temp2; strncpy(shm->spieleratt[temp2].spielername, temp1, sizeof(shm->spieleratt[temp2].spielername)); shm->spieleratt[temp2].regflag = temp3; } else if (strstr(line, "+ ENDPLAYERS") != 0) { // setze Flag für Spielverlaufsphase phase = 1; } } else if (phase == 1) { /* Spielverlaufsphase */ if (strstr(line, "+ WAIT") != 0) { // sende "OKWAIT" sprintf(clientMessage, "OKWAIT\n"); sendMessage(sock, clientMessage); printf("Warte auf Gegenspieler...\n"); } else if (strstr(line, "+ MOVE ") != 0) { // lese Zeit für Spielzug sscanf(line, "%*s %*s %d", &temp2); // temp2: Zeit für Spielzug } else if (strstr(line, "+ CAPTURE") != 0) { // lese Capturewert sscanf(line, "%*s %*s %d", &temp2); if (shmflag == 1) { // setze capture_flag spielfeld->capture_flag = temp2; } } else if (strstr(line, "+ PIECELIST") != 0) { // lese Anzahl Spieler/Steine pro Spieler sscanf(line, "%*s %*s %d,%d", &temp2, &temp3); // temp2: Anzahl Spieler // temp3: Anzahl Steine pro Spieler /* Spielfeld SHM */ if (shmflag == 0) { // Spielfeld SHM anlegen shmSizefeld = sizeof(spielfeld); spielfeldID = initshm(shmSizefeld); // Überprüfe spielfeldID if (spielfeldID < 1) { printf("Kein Spielfeld SHM vorhanden\n"); return EXIT_FAILURE; } // Spielfeld SHM binden spielfeld = (Spielfeldshm*) attachshm(spielfeldID); // Überprüfe Spielfeld SHM auf Fehler if (spielfeld == (void *) -1) { printf("Fehler beim Binden des Spielfeld SHM\n"); return EXIT_FAILURE; } // Steineverfuegbar Anfangswert zuweisen spielfeld->steineverfuegbar = 9; shm->spielfeldID = spielfeldID; shmflag = 1; } spielfeldleeren(spielfeld); spielfeld->anzsteine = temp3; } else if (strstr(line, "+ PIECE") != 0) { // lese Positionen der Steine sscanf(line, "%*s PIECE%d.%d %s", &temp2, &temp3, temp1); // temp2: Spielernummer // temp3: Steinnummer // temp1: Position des Steins steinespeichern(temp2, temp1, spielfeld); } else if (strstr(line, "+ ENDPIECELIST") != 0) { if(quitflag ==0){ // sende "THINKING" sprintf(clientMessage, "THINKING\n"); sendMessage(sock, clientMessage); } printspielfeld(spielfeld); } else if (strstr(line, "+ OKTHINK") != 0) { // Flag zur Überprüfung ob Thinker thinken darf (noch zu implementieren) shm->think_flag = 1; // Sende Signal SIGUSR1 an Thinker kill(getppid(), SIGUSR1); // Warten auf shm->think_flag = 1 while (shm->think_flag == 1) {} if (shm->think_flag == 0){ if (read(pipeRead, pipe_read, PIPE_BUF) == -1) { perror("\nFehler beim Lesen aus der Pipe"); return EXIT_FAILURE; } sprintf(clientMessage, "PLAY %s\n", pipe_read); // sende Spielzug sendMessage(sock, clientMessage); } } else if (strstr(line, "+ MOVEOK") != 0) { // Spielzug akzeptiert printf("Spielzug akzeptiert\n\n"); } else if (strstr(line, "+ GAMEOVER") != 0) { sscanf(line, "%*s GAMEOVER%d %s", &temp2, temp1); printf("Gameover! Spieler %d (%s) hat gewonnen\n", temp2 + 1,temp1); quitflag = 1; } else if (strstr(line, "+ QUIT") != 0) { printf("Verbindung wird abgebaut\n"); kill(getppid(),SIGUSR2); return EXIT_SUCCESS; } } break; // negative Antwort - Error Handling case '-': // gebe Servernachricht aus errorMessage = strndup(line + 2, strlen(line) - 2); if (strncmp(line, "- exiting", 9) == 0) { fprintf(stderr, "\nGame ID nicht gefunden\n"); } else if (strstr(line, "No free computer player found for that game - exiting") != 0) { fprintf(stderr, "\nKein freier Platz vorhanden\n"); } else if (strstr(line, "Socket timeout - please be quicker next time") != 0) { fprintf(stderr, "\nSocket timeout\n"); } else if (strstr(line, "Protocol mismatch - you probably didn't want to talk to the fabulous gameserver") != 0) { fprintf(stderr, "\nProtocol mismatch\n"); } else if (strstr(line, "We expected you to THINK!") != 0) { fprintf(stderr, "\nZuerst OKTHINK senden, erst dann den Spielzug\n"); } else if (strstr(line, "Destination is already occupied") != 0) { fprintf(stderr, "\nSpielzug ungültig: Das Feld ist schon besetzt\n"); } else if (strstr(line, "You can't capture yourself") != 0) { fprintf(stderr, "\nSpielzug ungültig: Du kannst deinen eigenen Stein nicht entfernen\n"); } else { fprintf(stderr, "\nUnerwarteter Serverfehler: %s\n", errorMessage); } return EXIT_FAILURE; // default default: fprintf(stderr, "\nServernachricht kann nicht verarbeitet werden\n"); return EXIT_FAILURE; } } }