Example #1
0
 int wolfInit(int argc, char *argvs[])
 {
     puts("Wolf init.");
     initshm();
     puts((char *)shm);
     newOmega();
     return 0;
 }
Example #2
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);
}
Example #3
0
File: video.c Project: kytvi2p/uTox
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;
}
Example #4
0
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;
}
Example #5
0
/**
 * 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;

		}
	}
}