--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4,11 +4,14 @@
  * https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
  */
 
+#include <ctype.h>
 #include <stdio.h>
 #include <syslog.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include "luacompat.h"
 #include "luaxlib.h"
 #include "luaxcore.h"
@@ -16,35 +19,36 @@
 
 int main(int argc,char** argv)
 {
-    const char* p=strrchr(argv[0],'/');
-
-    int rc;
-
-    if(p)
-    {
-        char location[512];
-        int n=p-argv[0];
-        if(n>=sizeof(location))
-            n=sizeof(location)-1;
-        strncpy(location,argv[0],n);
-        location[n]=0;
-
-        rc=chdir(location);
-
-        argv[0]=(char*)p+1;
-    }
-
-    const char* root=getenv("XUPNPDROOTDIR");
-    if(root && *root)
-        rc=chdir(root);
-
-    {
-        FILE* fp=fopen("xupnpd.lua","r");
-        if(fp)
-            fclose(fp);
-        else
-            rc=chdir("/usr/share/xupnpd/");
-    }
+	int c;
+	char *xupnpd_root = "/usr/share/xupnpd/";
+	struct stat s;
+
+	opterr = 0;
+	while ((c = getopt (argc, argv, "d:")) != -1) {
+		switch (c) {
+			case 'd':
+				xupnpd_root = optarg;
+				break;
+			case '?':
+				if (optopt == 'd')
+					fprintf(stderr, "Option -%c requires an argument.\n", optopt);
+				else if (isprint(optopt))
+					fprintf(stderr, "Unknown option \"-%c\".\n", optopt);
+				else
+					fprintf(stderr, "Unknown option\n");
+					return 1;
+			default:
+				abort();
+		}
+	}
+
+	if(stat(xupnpd_root, &s) != -1 && S_ISDIR(s.st_mode)) {
+		c = chdir(xupnpd_root);
+	}
+	else {
+		fprintf(stderr, "Directory %s doesn't exist.\n", xupnpd_root);
+		return 1;
+	}
 
     lua_State* L=lua_open();
     if(L)