Wed, 05 Feb 2014 14:07:43 +0100
added (single) client / server architecture
0 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * | |
4 | * Copyright 2014 Mike Becker. All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | * | |
28 | */ | |
29 | ||
1
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
30 | #include "terminal-chess.h" |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
31 | #include <string.h> |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
32 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
33 | int get_settings(int argc, char **argv, Settings *settings) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
34 | char *valid; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
35 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
36 | for (char opt ; (opt = getopt(argc, argv, "hp:")) != -1 ;) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
37 | switch (opt) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
38 | case 'p': |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
39 | if (strtol(optarg, &valid, 10) < 1025 || *valid != '\0') { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
40 | fprintf(stderr, |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
41 | "Invalid port number (%s) - choose a number > 1024\n", |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
42 | optarg); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
43 | return 1; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
44 | } else { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
45 | settings->port = optarg; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
46 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
47 | break; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
48 | case 'h': |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
49 | case '?': |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
50 | settings->printhelp = 1; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
51 | break; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
52 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
53 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
54 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
55 | if (optind == argc - 1) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
56 | settings->serverhost = argv[optind]; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
57 | } else if (optind < argc - 1) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
58 | fprintf(stderr, "Too many arguments\n"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
59 | return 1; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
60 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
61 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
62 | return 0; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
63 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
64 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
65 | Settings default_settings() { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
66 | Settings settings; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
67 | memset(&settings, 0, sizeof(Settings)); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
68 | settings.port = "27015"; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
69 | return settings; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
70 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
71 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
72 | int cleanup(Settings *settings, int exitcode) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
73 | if (settings->server) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
74 | if (net_destroy(settings->server)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
75 | perror("Server shutdown failed"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
76 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
77 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
78 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
79 | return exitcode; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
80 | } |
0 | 81 | |
82 | int main(int argc, char **argv) { | |
1
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
83 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
84 | Settings settings = default_settings(); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
85 | get_settings(argc, argv, &settings); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
86 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
87 | if (settings.printhelp) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
88 | printf( |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
89 | "Usage: %s [OPTION]... [HOST]\n" |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
90 | "Starts/joins a network chess game\n\n" |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
91 | " -h This help page\n" |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
92 | " -p TCP port to use (default: 27015)\n", |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
93 | argv[0]); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
94 | return EXIT_SUCCESS; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
95 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
96 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
97 | Server server; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
98 | settings.server = &server; |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
99 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
100 | if (is_server(&settings)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
101 | if (net_find(&server, settings.serverhost, settings.port)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
102 | perror("Can't find server"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
103 | return cleanup(&settings, EXIT_FAILURE); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
104 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
105 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
106 | if (net_connect(&server)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
107 | perror("Can't connect to server"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
108 | return cleanup(&settings, EXIT_FAILURE); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
109 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
110 | } else { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
111 | if (net_create(&server, settings.port)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
112 | perror("Server creation failed"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
113 | return cleanup(&settings, EXIT_FAILURE); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
114 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
115 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
116 | if (net_listen(&server)) { |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
117 | perror("Listening for client failed"); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
118 | return cleanup(&settings, EXIT_FAILURE); |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
119 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
120 | } |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
121 | |
e5fbb8f9edbe
added (single) client / server architecture
Mike Becker <universe@uap-core.de>
parents:
0
diff
changeset
|
122 | return cleanup(&settings, EXIT_SUCCESS); |
0 | 123 | } |
124 |