int main(int argc, char *argv[]) { SDL_Window *window; CLC_CONFIG config; Uint8 *kbdstate; SDL_Event e; PLAYER *me; PLAYER *player; Uint32 time; IPaddress srv_ip; TCPsocket srv_sock; Uint16 magic; int i; SDLNet_SocketSet srv_sset; char myname[PNAME_SIZE]; unsigned char myno; if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_EVENTS) == -1) { fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } if (SDLNet_Init() == -1) { fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError()); exit(EXIT_FAILURE); } parsecfg(&config); /* * Get player name. */ printf("Wow such name: "); fgets(myname, PNAME_SIZE, stdin); for (i = 0; i < PNAME_SIZE; i++) { if (myname[i] == '\n') { myname[i] = '\0'; break; } } /* * Connect to server! */ if (SDLNet_ResolveHost(&srv_ip, config.defaultsrv, atoi(config.defaultport))) { fprintf(stderr, "SDLNet_ResolveHost: %s\n", SDLNet_GetError()); exit(EXIT_FAILURE); } /* * Bind socket! */ if (!(srv_sock = SDLNet_TCP_Open(&srv_ip))) { fprintf(stderr, "SDLNet_TCP_Open: %s\n", SDLNet_GetError()); exit(EXIT_FAILURE); } /* * Add (a single) server socket to srv_sset for cheap hack for checking * the server socket's state. */ srv_sset = SDLNet_AllocSocketSet(1); if (!srv_sset) { printf("SDLNet_AllocSocketSet: %s\n", SDLNet_GetError()); exit(EXIT_FAILURE); } SDLNet_TCP_AddSocket(srv_sset, srv_sock); /* * Get maze, add connecting players to buffer and wait until the game * begins. */ getmaze(srv_sock); window = SDL_CreateWindow( "MAZE OF TORMENT", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, config.win_width, config.win_height, config.win_flags ); SDL_GetWindowSize(window, &config.win_width, &config.win_height); if (window == NULL) { fprintf(stderr, "Could not create window: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } renderer = SDL_CreateRenderer(window, -1, config.renderflags); hsprite = loadPic("img/predator.gif"); psprite = loadPic("img/prey.gif"); black = loadPic("img/black.gif"); /* * Initialize maze, and send player name. */ MAZE.X = (config.win_width - MAZE.w * 16) / 2; MAZE.Y = (config.win_height - MAZE.h * 16) / 2; SDLNet_TCP_Send(srv_sock, myname, PNAME_SIZE); /* * Initialize maze and get the LOCAL player, then the REMOTE players. */ SDLNet_TCP_Recv(srv_sock, &myno, 1); player = calloc(1, sizeof(PLAYER)); if (!((magic = getshort(srv_sock)) == ADD_PLAYER)) { printf("server not sending players\n!"); exit(EXIT_FAILURE); } unsigned char hunter = addp(player, srv_sock); choose_hunter(player, hunter); me = choose_player(player, myno); SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); draw_maze(MAZE.X, MAZE.Y); PLAYER *temp; for (temp = player->next; temp != NULL; temp = temp->next) { printf("drew player %d\n", temp->playerno); drawPlayer(temp); } printf("starting game!!\n"); /* * Game loop! */ for (;;) { time = SDL_GetTicks(); /* * Poll the network in each frame. Because. */ int result, numready = SDLNet_CheckSockets(srv_sset, 0); if (numready == -1) { printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError()); perror("SDLNet_CheckSockets"); } else if (numready) { unsigned char packet; unsigned char pnum, movx, movy; printf("srv socket is ready!!\n"); if ((result = SDLNet_TCP_Recv(srv_sock, &packet, 2)) == 2) { switch (SDLNet_Read16(&packet)) { case PLAYER_MOV: puts("PLAYER_MOV"); pnum = getshort(srv_sock); movx = getshort(srv_sock); movy = getshort(srv_sock); printf("player %d moved to (%d,%d)\n", pnum, movx, movy); movePlayer(choose_player(player,pnum), movx, movy); break; case PLAYER_WIN: puts("PLAYER_WIN"); break; case PLAYER_DC: puts("PLAYER_DC"); pnum = getshort(srv_sock); printf("Player %d disconnected!!\n", pnum); removep(choose_player(player,pnum)); break; case PLAYER_DIE: puts("PLAYER_DIE"); pnum = getshort(srv_sock); if (pnum == myno) { puts("YOU ARE DEAD\nGAME OVER"); goto exit; } printf("Player %d deaded!!!!!\n", pnum); removep(choose_player(player, pnum)); break; } } else if (result <= 0) { fprintf(stderr, "SDLNet_TCP_Recv: %s\n", SDLNet_GetError()); fprintf(stderr, "Lost connection to the server?\n"); break; } } /* * Poll for keys */ if (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { break; } kbdstate = (Uint8 *) SDL_GetKeyboardState(NULL); if (kbdstate[SDL_SCANCODE_Q]) { break; } local_player_update(srv_sock, me, player, SDL_GetKeyboardState(NULL)); } SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255); SDL_RenderPresent(renderer); if (20 > (SDL_GetTicks() - time)) { SDL_Delay(20 - (SDL_GetTicks() - time)); } } exit: SDL_DestroyTexture(psprite.texture); SDL_DestroyTexture(hsprite.texture); SDL_DestroyTexture(black.texture); free(player); free(MAZE.data); SDL_DestroyWindow(window); SDLNet_Quit(); SDL_Quit(); return 0; }
static void parseopts(int argc, char *argv[]) { static const struct option long_options[] = { { "config", 1, 0, 'c' }, { "syslog", 0, 0, 's' }, { "nosimd", 0, 0, 'S' }, { "daemonize", 0, 0, 'D' }, { 0, 0, 0, 0 } }; char *configname = NULL, *cfgname, *filename = "/etc/ax25/soundmodem.conf"; unsigned int verblevel = 2, tosyslog = 0, simd = 1, schedrr = 0, lockmem = 0, daemonize = 0; int c, err = 0; xmlDocPtr doc; xmlNodePtr node; int pfds[2]; pid_t pid; unsigned char uch; while ((c = getopt_long(argc, argv, "v:sSc:RD" MLOCKOPT, long_options, NULL)) != EOF) { switch (c) { case 'v': verblevel = strtoul(optarg, NULL, 0); break; case 's': tosyslog = 1; break; case 'S': simd = 0; break; case 'c': configname = optarg; break; case 'R': schedrr = 1; break; #ifdef HAVE_MLOCKALL case 'M': lockmem = 1; break; #endif /* HAVE_MLOCKALL */ case 'D': daemonize = 1; break; default: err++; break; } } if (err) { fprintf(stderr, "usage: [-v <verblevel>] [-s] [-S] [-R]" MLOCKHLP " [-c <configname>] <configfile>\n"); exit(1); } loginit(verblevel, tosyslog); if (daemonize) { if (pipe(pfds)) logerr(MLOG_FATAL, "pipe"); switch (pid = fork()) { case -1: logerr(MLOG_FATAL, "fork"); case 0: /* child process */ close(pfds[0]); setsid(); /* become a process group leader and drop controlling terminal */ fclose(stdin); /* no more standard in */ break; default: /* parent process */ close(pfds[1]); err = read(pfds[0], &uch, sizeof(uch)); if (err != sizeof(uch)) logprintf(MLOG_FATAL, "SoundModem init failed\n"); exit(0); } } initsimd(simd); #if 0 if (optind >= argc) logprintf(MLOG_FATAL, "no configuration file specified\n"); #endif if (optind < argc) filename = argv[optind]; doc = xmlParseFile(filename); if (!doc || !doc->root || !doc->root->name) logprintf(MLOG_FATAL, "Error parsing config file \"%s\"\n", filename); if (strcmp(doc->root->name, "modem")) logprintf(MLOG_FATAL, "Config file does not contain modem data\n"); for (node = doc->root->childs; node; node = node->next) { if (!node->name || strcmp(node->name, "configuration")) continue; if (!configname) break; cfgname = xmlGetProp(node, "name"); if (cfgname && !strcmp(cfgname, configname)) break; } if (!node) logprintf(MLOG_FATAL, "Configuartion not found\n"); if (!node->childs) logprintf(MLOG_FATAL, "Configuration empty\n"); err = parsecfg(doc, node->childs, &state, &schedrr); xmlFreeDoc(doc); if (err) exit(1); /* * lock memory down */ #ifdef HAVE_MLOCKALL if (lockmem) { if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) logerr(MLOG_ERROR, "mlockall"); } #endif /* HAVE_MLOCKALL */ #ifdef HAVE_SCHED_H if (schedrr) { struct sched_param schp; memset(&schp, 0, sizeof(schp)); schp.sched_priority = sched_get_priority_min(SCHED_RR)+1; if (sched_setscheduler(0, SCHED_RR, &schp) != 0) logerr(MLOG_ERROR, "sched_setscheduler"); } #endif /* HAVE_SCHED_H */ if (daemonize) { uch = 0; if (write(pfds[1], &uch, sizeof(uch)) != sizeof(uch)) logerr(MLOG_ERROR, "write"); close(pfds[1]); } }
int dconnect(const struct optstruct *opt) { struct sockaddr_un server; struct sockaddr_in server2; struct hostent *he; struct cfgstruct *copt, *cpt; const char *clamav_conf = getargl(opt, "config-file"); int sockd; if(!clamav_conf) clamav_conf = DEFAULT_CFG; if((copt = parsecfg(clamav_conf, 1)) == NULL) { mprintf("@Can't parse the configuration file.\n"); return -1; } memset((char *) &server, 0, sizeof(server)); memset((char *) &server2, 0, sizeof(server2)); /* Set default address to connect to */ server2.sin_addr.s_addr = inet_addr("127.0.0.1"); if(cfgopt(copt, "TCPSocket") && cfgopt(copt, "LocalSocket")) { mprintf("@Clamd is not configured properly.\n"); return -1; } else if((cpt = cfgopt(copt, "LocalSocket"))) { server.sun_family = AF_UNIX; strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path)); if((sockd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket()"); mprintf("@Can't create the socket.\n"); return -1; } if(connect(sockd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) { close(sockd); perror("connect()"); mprintf("@Can't connect to clamd.\n"); return -1; } } else if((cpt = cfgopt(copt, "TCPSocket"))) { if((sockd = socket(SOCKET_INET, SOCK_STREAM, 0)) < 0) { perror("socket()"); mprintf("@Can't create the socket.\n"); return -1; } server2.sin_family = AF_INET; server2.sin_port = htons(cpt->numarg); if((cpt = cfgopt(copt, "TCPAddr"))) { if ((he = gethostbyname(cpt->strarg)) == 0) { close(sockd); perror("gethostbyname()"); mprintf("@Can't lookup clamd hostname.\n"); return -1; } server2.sin_addr = *(struct in_addr *) he->h_addr_list[0]; } if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) { close(sockd); perror("connect()"); mprintf("@Can't connect to clamd.\n"); return -1; } } else { mprintf("@Clamd is not configured properly.\n"); return -1; } return sockd; }