init.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /* $Id */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <string.h>
  7. #include <server.h>
  8. #include <conf.h>
  9. #include <network.h>
  10. #include <ipc.h>
  11. #include <general.h>
  12. #include <libgen.h>
  13. /* TODO: Port the shared memory system */
  14. static conf_t *get_default_conf()
  15. {
  16. conf_t *res;
  17. res = shm_alloc(sizeof(*res), get_shm_conf_id());
  18. res->verbose = False;
  19. res->quiet = False;
  20. res->gfx = False;
  21. res->map_name = CONF_DEFAULT_MAP;
  22. res->nb_turns = CONF_DEFAULT_NBTURNS;
  23. res->turn_msec = CONF_DEFAULT_TURN_MSEC;
  24. res->turn_take_akx = DEF_TURN_TAKE_AKX;
  25. res->turn_untake_akx = DEF_TURN_UNTAKE_AKX;
  26. res->turn_take_r4d2 = DEF_TURN_TAKE_R4D2;
  27. res->turn_untake_r4d2 = DEF_TURN_UNTAKE_R4D2;
  28. res->r4d2_speed = DEF_R4D2_SPEED;
  29. res->akx_speed = DEF_AKX_SPEED;
  30. res->pulse_power = DEF_PULSE_POWER;
  31. res->see_power = DEF_SEE_POWER;
  32. res->destroy_speed = DEF_DESTROY_SPEED;
  33. res->pulse_coef = DEF_PULSE_COEF;
  34. res->nb_akx = res->nb_r4d2 = res->nb_objects = 0;
  35. res->size_x = DEF_SIZE_X;
  36. res->size_y = DEF_SIZE_Y;
  37. res->players = NULL;
  38. res->nb_players = 0;
  39. res->turn_num = 0;
  40. res->sand_file = NULL;
  41. res->port = CONF_DEFAULT_PORT;
  42. res->pub = True;
  43. return res;
  44. }
  45. static void cmdline_add_player(const char *str, conf_t *conf)
  46. {
  47. char *name, *filename;
  48. char *p;
  49. static int id = 1;
  50. name = strdup(str);
  51. p = strchr(name, ':');
  52. if (p == NULL)
  53. {
  54. filename = name;
  55. name = strdup(basename(filename));
  56. }
  57. else
  58. {
  59. *p = 0;
  60. filename = strdup(p + 1);
  61. }
  62. conf->players = g_slist_prepend(conf->players, new_player(filename, name, id++, conf));
  63. }
  64. static void help(char **argv)
  65. {
  66. printf("%s", "Serveur Prologin version 0.9\n");
  67. printf("\n");
  68. printf("Syntaxe: %s [options] [-m carte] nom:fichier ...\n", argv[0]);
  69. printf("\nOptions:\n");
  70. printf(" -v \t Mode verbose.\n");
  71. printf(" -q \t Supprime les messages des clients.\n");
  72. printf(" -n val \t Nombre de tours que dure la partie.\n");
  73. printf(" -t val \t Nombre de milliseconde pas tour.\n");
  74. printf(" -m \t Fichier carte.\n");
  75. printf("\nOptions graphiques:\n");
  76. printf(" -g \t Accepte les clients graphiques.\n");
  77. printf(" -P \t Mode prive.\n");
  78. printf(" -p val \t Port pour les clients graphiques (4242).\n");
  79. }
  80. static conf_t *parse_cmdline(int argc, char **argv)
  81. {
  82. int i;
  83. conf_t *res;
  84. res = get_default_conf();
  85. for (i = 1 ; i < argc ; i++)
  86. {
  87. if (argv[i][0] == '-')
  88. {
  89. switch (argv[i][1])
  90. {
  91. case 'h':
  92. help(argv);
  93. exit(0);
  94. case 'P':
  95. res->pub = False;
  96. break;
  97. case 'v':
  98. res->verbose = True;
  99. break;
  100. case 'g':
  101. res->gfx = True;
  102. break;
  103. case 'q':
  104. res->quiet = True;
  105. break;
  106. case 'n':
  107. i++;
  108. if (i == argc)
  109. {
  110. printf("-n requiert un argument.\n");
  111. return NULL;
  112. }
  113. res->nb_turns = atoi(argv[i]);
  114. break;
  115. case 't':
  116. i++;
  117. if (i == argc)
  118. {
  119. printf("-t requiert un argument.\n");
  120. return NULL;
  121. }
  122. res->turn_msec = atoi(argv[i]);
  123. break;
  124. case 'p':
  125. i++;
  126. if (i == argc)
  127. {
  128. printf("-p requiert un argument.\n");
  129. return NULL;
  130. }
  131. res->port = atoi(argv[i]);
  132. break;
  133. case 'm':
  134. i++;
  135. if (i == argc)
  136. {
  137. printf("-m requiert un argument.\n");
  138. return NULL;
  139. }
  140. res->map_name = argv[i];
  141. break;
  142. }
  143. }
  144. else
  145. {
  146. cmdline_add_player(argv[i], res);
  147. }
  148. }
  149. res->nb_players = g_slist_length(res->players);
  150. return res;
  151. }
  152. conf_t *init(int argc, char **argv)
  153. {
  154. conf_t *conf;
  155. sigset_t mask2;
  156. if (argc < 2)
  157. {
  158. help(argv);
  159. return NULL;
  160. }
  161. gl_config = conf = parse_cmdline(argc, argv);
  162. if (conf == NULL)
  163. {
  164. return NULL;
  165. }
  166. //atexit(clean_shm);
  167. load_map(conf);
  168. gfx_init();
  169. sigprocmask(0, NULL, &mask2);
  170. sigaddset(&mask2, SIGUSR1);
  171. sigaddset(&mask2, SIGCHLD);
  172. conf->mask = malloc(sizeof(*conf->mask));
  173. sigprocmask(SIG_SETMASK, &mask2, conf->mask);
  174. signal(SIGINT, exit);
  175. return conf;
  176. }
  177. void abort()
  178. {
  179. fflush(stdout);
  180. fflush(stderr);
  181. fprintf(stdout, "\nBye!\n");
  182. fflush(stdout);
  183. exit(1);
  184. }