]> git.pond.sub.org Git - empserver/blobdiff - src/client/main.c
Update copyright notice
[empserver] / src / client / main.c
index 3df9d3ba4c7a6c532cf5eab95931cff0026a2ce1..898d7d64aeb0a9a3c0047c2bf0014a56e8cadb49 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
- *                           Ken Stevens, Steve McClure
+ *  Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  Empire is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *  ---
  *
  *  Known contributors to this file:
  *     Dave Pare, 1986
  *     Steve McClure, 1998
- *     Ron Koenderink, 2004-2005
- *     Markus Armbruster, 2005-2009
+ *     Ron Koenderink, 2004-2007
+ *     Markus Armbruster, 2005-2010
+ *     Tom Dickson-Hunt, 2010
  */
 
 #include <config.h>
 
 #include <stdlib.h>
-#ifndef _WIN32
+#include <string.h>
+#ifdef _WIN32
+#include <windows.h>
+#include "sys/socket.h"
+#else
 #include <pwd.h>
-#include <unistd.h>
 #endif
+#include <unistd.h>
 #include "misc.h"
 #include "version.h"
 
 #define getuid() 0
 #define getpwuid(uid) ((void)(uid), w32_getpw())
 #define sysdep_init() w32_sysdep_init()
-#else
+
+struct passwd {
+    char *pw_name;
+};
+
+static struct passwd *w32_getpw(void);
+static void w32_sysdep_init(void);
+#else  /* !_WIN32 */
 #define sysdep_init() ((void)0)
-#endif
+#endif /* !_WIN32 */
 
 static void
 print_usage(char *program_name)
@@ -58,6 +69,7 @@ print_usage(char *program_name)
     printf("Usage: %s [OPTION]...[COUNTRY [PASSWORD]]\n"
           "  -2 FILE         Append log of session to FILE\n"
           "  -k              Kill connection\n"
+          "  -s [HOST:]PORT  Specify server HOST and PORT\n"
           "  -u              Use UTF-8\n"
           "  -h              display this help and exit\n"
           "  -v              display version information and exit\n",
@@ -70,16 +82,17 @@ main(int argc, char **argv)
     int opt;
     char *auxfname = NULL;
     int send_kill = 0;
+    char *host = NULL;
+    char *port = NULL;
     int utf8 = 0;
     char **ap;
     char *country;
     char *passwd;
     char *uname;
-    char *host;
-    char *port;
+    char *colon;
     int sock;
 
-    while ((opt = getopt(argc, argv, "2:kuhv")) != EOF) {
+    while ((opt = getopt(argc, argv, "2:ks:uhv")) != EOF) {
        switch (opt) {
        case '2':
            auxfname = optarg;
@@ -87,6 +100,15 @@ main(int argc, char **argv)
        case 'k':
            send_kill = 1;
            break;
+       case 's':
+           port = strdup(optarg);
+           colon = strrchr(port, ':');
+           if (colon) {
+               *colon = 0;
+               host = port;
+               port = colon + 1;
+           }
+           break;
        case 'u':
            utf8 = eight_bit_clean = 1;
            break;
@@ -97,7 +119,7 @@ main(int argc, char **argv)
            printf("%s\n\n%s", version, legal);
            exit(0);
        default:
-           print_usage(argv[0]);
+           fprintf(stderr, "Try -h for help.\n");
            exit(1);
        }
     }
@@ -111,10 +133,12 @@ main(int argc, char **argv)
        passwd = *ap++;
     else
        passwd = getenv("PLAYER");
-    port = getenv("EMPIREPORT");
+    if (!port)
+       port = getenv("EMPIREPORT");
     if (!port)
        port = empireport;
-    host = getenv("EMPIREHOST");
+    if (!host)
+       host = getenv("EMPIREHOST");
     if (!host)
        host = empirehost;
     uname = getenv("LOGNAME");
@@ -128,6 +152,11 @@ main(int argc, char **argv)
        }
        uname = pwd->pw_name;
     }
+    if (*ap) {
+       fprintf(stderr, "%s: extra operand %s\n", argv[0], *ap);
+       fprintf(stderr, "Try -h for help.\n");
+       exit(1);
+    }
 
     getsose();
     if (auxfname && (auxfp = fopen(auxfname, "a")) == NULL) {
@@ -147,3 +176,47 @@ main(int argc, char **argv)
 
     return 0;
 }
+
+#ifdef _WIN32
+/*
+ * Get Windows user name
+ */
+static struct passwd *
+w32_getpw(void)
+{
+    static char unamebuf[128];
+    static struct passwd pwd;
+    DWORD unamesize;
+
+    unamesize = sizeof(unamebuf);
+    if (GetUserName(unamebuf, &unamesize)) {
+       pwd.pw_name = unamebuf;
+       if (unamesize == 0 || strlen(unamebuf) == 0)
+           pwd.pw_name = "nobody";
+    } else
+       pwd.pw_name = "nobody";
+    return &pwd;
+}
+
+static void
+w32_sysdep_init(void)
+{
+    int err;
+
+    /*
+     * stdout is unbuffered under Windows if connected to a character
+     * device, and putchar() screws up when printing multibyte strings
+     * bytewise to an unbuffered stream.  Switch stdout to line-
+     * buffered mode.  Unfortunately, ISO C allows implementations to
+     * screw that up, and of course Windows does.  Manual flushing
+     * after each prompt is required.
+     */
+    setvbuf(stdout, NULL, _IOLBF, 4096);
+
+    err = w32_socket_init();
+    if (err != 0) {
+       fprintf(stderr, "WSAStartup Failed, error code %d\n", err);
+       exit(1);
+    }
+}
+#endif