Index: trunk/ntripclient/NtripLinuxClient.c
===================================================================
--- trunk/ntripclient/NtripLinuxClient.c	(revision 31)
+++ trunk/ntripclient/NtripLinuxClient.c	(revision 40)
@@ -1,5 +1,5 @@
 /*
   Easy example NTRIP client for Linux/Unix.
-  $Id: NtripLinuxClient.c,v 1.15 2005/12/06 16:50:26 euronav Exp $
+  $Id: NtripLinuxClient.c,v 1.16 2006/04/27 09:44:17 stoecker Exp $
   Copyright (C) 2003-2005 by Dirk Stoecker <soft@dstoecker.de>
     
@@ -22,4 +22,5 @@
 #include <ctype.h>
 #include <getopt.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -36,8 +37,9 @@
 
 #define MAXDATASIZE 1000 /* max number of bytes we can get at once */
+#define ALARMTIME   (2*60)
 
 /* CVS revision and version */
-static char revisionstr[] = "$Revision: 1.15 $";
-static char datestr[]     = "$Date: 2005/12/06 16:50:26 $";
+static char revisionstr[] = "$Revision: 1.16 $";
+static char datestr[]     = "$Date: 2006/04/27 09:44:17 $";
 
 struct Args
@@ -64,5 +66,85 @@
 {0,0,0,0}};
 #endif
-#define ARGOPT "d:hp:r:s:u:"
+#define ARGOPT "-d:hp:r:s:u:"
+
+#ifdef __GNUC__
+static __attribute__ ((noreturn)) void sighandler_alarm(
+int sig __attribute__((__unused__)))
+#else /* __GNUC__ */
+static void sighandler_alarm(int sig)
+#endif /* __GNUC__ */
+{
+  fprintf(stderr, "ERROR: more than %d seconds no activity\n", ALARMTIME);
+  exit(1);
+}
+
+static const char *geturl(const char *url, struct Args *args)
+{
+  static char buf[1000];
+  static char *Buffer = buf;
+  static char *Bufend = buf+sizeof(buf);
+
+  if(strncmp("ntrip:", url, 6))
+    return "URL must start with 'ntrip:'.";
+  url += 6; /* skip ntrip: */
+
+  /* scan for mountpoint */
+  args->data = Buffer;
+  while(*url && *url != '@' && *url != '/' && Buffer != Bufend)
+    *(Buffer++) = *(url++);
+  if(Buffer == args->data)
+    return "Mountpoint required.";
+  else if(Buffer >= Bufend-1)
+    return "Parsing buffer too short.";
+  *(Buffer++) = 0;
+
+  if(*url == '/') /* username and password */
+  {
+    ++url;
+    args->user = Buffer;
+    while(*url && *url != '@' && *url != ':' && Buffer != Bufend)
+      *(Buffer++) = *(url++);
+    if(Buffer == args->user)
+      return "Username cannot be empty.";
+    else if(Buffer >= Bufend-1)
+      return "Parsing buffer too short.";
+    *(Buffer++) = 0;
+
+    if(*url == ':') ++url;
+
+    args->password = Buffer;
+    while(*url && *url != '@' && Buffer != Bufend)
+      *(Buffer++) = *(url++);
+    if(Buffer == args->password)
+      return "Password cannot be empty.";
+    else if(Buffer >= Bufend-1)
+      return "Parsing buffer too short.";
+    *(Buffer++) = 0;
+  }
+
+  if(*url == '@') /* server */
+  {
+    ++url;
+    args->server = Buffer;
+    while(*url && *url != ':' && Buffer != Bufend)
+      *(Buffer++) = *(url++);
+    if(Buffer == args->server)
+      return "Servername cannot be empty.";
+    else if(Buffer >= Bufend-1)
+      return "Parsing buffer too short.";
+    *(Buffer++) = 0;
+
+    if(*url == ':')
+    {
+      char *s2 = 0;
+      args->port = strtol(++url, &s2, 10);
+      if(*s2 || args->port <= 0 || args->port > 0xFFFF)
+        return "Illegal port number.";
+      url = s2;
+    }
+  }
+
+  return *url ? "Garbage at end of server string." : 0;
+}
 
 static int getargs(int argc, char **argv, struct Args *args)
@@ -94,4 +176,14 @@
     case 'd': args->data = optarg; break;
     case 'h': help=1; break;
+    case 1:
+      {
+        const char *err;
+        if((err = geturl(optarg, args)))
+        {
+          fprintf(stderr, "%s\n\n", err);
+          res = 0;
+        }
+      }
+      break;
     case 'r': 
       args->port = strtoul(optarg, &t, 10);
@@ -101,5 +193,5 @@
     case -1: break;
     }
-  } while(getoptr != -1 || !res);
+  } while(getoptr != -1 && res);
 
   for(a = revisionstr+11; *a && *a != ' '; ++a)
@@ -119,5 +211,5 @@
   if(!res || help)
   {
-    fprintf(stderr, "Version %s (%s) GPL\nUsage: %s -s server -u user ...\n"
+    fprintf(stderr, "Version %s (%s) GPL\nUsage:\n%s -s server -u user ...\n"
     " -d " LONG_OPT("--data     ") "the requested data set\n"
     " -s " LONG_OPT("--server   ") "the server name or address\n"
@@ -125,5 +217,6 @@
     " -r " LONG_OPT("--port     ") "the server port number (default 80)\n"
     " -u " LONG_OPT("--user     ") "the user name\n"
-    , revisionstr, datestr, argv[0]);
+    "or using an URL:\n%s ntrip:mountpoint[/username[:password]][@server[:port]]\n"
+    , revisionstr, datestr, argv[0], argv[0]);
     exit(1);
   }
@@ -187,4 +280,6 @@
   setbuf(stdin, 0);
   setbuf(stderr, 0);
+  signal(SIGALRM,sighandler_alarm);
+  alarm(ALARMTIME);
 
   if(getargs(argc, argv, &args))
@@ -261,6 +356,8 @@
     {
       int k = 0;
+
       while((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) != -1)
       {
+        alarm(ALARMTIME);
         if(!k)
         {
