Expansion von Platzhaltern aus master verlegt
Die Funktionalitaet wird nun ganz aus dem Mastercode entfernt
und zieht um nach /std/util/path, von wo es geerbt werden kann.
Dort findet sich nun auch normalize_path().
Der Code im Master beschraenkt sich vollstaendig darauf,
Pfade "sane" zu machen.
Change-Id: I7a38366466aa206f858be9ff1d5fb9573504ce43
diff --git a/secure/master.c b/secure/master.c
index 306f0a7..b4b79d1 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -431,9 +431,9 @@
// path_array nach strs
// TODO: was ist mit clones?
if(objectp(str))
- strs=path_array(object_name(str), 0, 0);
+ strs=path_array(object_name(str));
else if(stringp(str))
- strs=path_array(str, 0, 0);
+ strs=path_array(str);
else return NOBODY;
// absolute Pfade interessieren hier gerade nicht.
diff --git a/secure/master.h b/secure/master.h
index f97b0d0..51f579b 100644
--- a/secure/master.h
+++ b/secure/master.h
@@ -26,7 +26,6 @@
#include "/secure/config.h"
#include "/sys/userinfo.h"
-#include "/sys/shells.h"
#include "/sys/player/base.h"
#include "/sys/moving.h"
#include "/sys/defines.h"
diff --git a/secure/master/file_access.c b/secure/master/file_access.c
index 93738ab..8b1bbd5 100644
--- a/secure/master/file_access.c
+++ b/secure/master/file_access.c
@@ -24,48 +24,11 @@
// Normalisiert den Pfad und liefert ein Array mit Pfadelementen.
// expand bestimmt, ob im Pfad +, ~ oder P_CURRENTDIR expandiert werden oder
// nicht.
-string *path_array(string path, string user, int expand) {
- string cwd;
+string *path_array(string path) {
if (!sizeof(path))
return ({"",""}); // additional "" to yield "/" later.
- // expand gibt es nur wenn angefordert
- if (expand)
- {
- switch(path[0])
- {
- // expand nur fuer nicht-absolute Pfade
- case '/':
- break;
- case '+':
- if(sizeof(path)==1)
- return ({"",DOMAINDIR});
- path="/"DOMAINDIR"/" + path[1..];
- break;
- case '~':
- if (sizeof(path)==1)
- {
- if(user)
- return ({"",WIZARDDIR,user});
- else
- return ({"",WIZARDDIR});
- }
- else
- {
- if(user && sizeof(path)>1 && path[1]=='/') // "~/"
- path="/"WIZARDDIR"/" + user + "/" + path[2..];
- else
- path="/"WIZARDDIR"/" + path[1..];
- }
- break;
- default:
- if(user && TP && getuid(TP) == user
- && (cwd=(string)TP->QueryProp(P_CURRENTDIR)))
- path=cwd + "/" + path;
- }
- }
-
// remove multiple '/'erstn gv
path = regreplace(path, "/+", "/", 1);
@@ -109,23 +72,13 @@
// Pfadnormalisierung OHNE Ersetzungen von +, ~ und P_CURRENTDIR (war mal mit)
// Eigentlich hier ziemlich unnuetz, aber nen Haufen Objekte im Mud ruft das.
string _get_path(string path, string user) {
- return implode(path_array(path, user, 0),"/");
-}
-
-// Besser benamste Version von _get_path().
-// Normalisiert den Pfad, expandiert Platzhalter auf Wunsch, benutzt ggf. TI
-// oder TP als User, wenn nicht angegeben.
-varargs string normalize_path(string path, string user, int expand) {
- if (!user && (TI || TP))
- user = getuid(TI || TP);
- return implode(path_array(path, user, expand), "/");
+ return implode(path_array(path),"/");
}
// Diese Funktion wird vom Driver nur fuer den Editor ed gerufen, aber der
-// Rest vom MG ruft es teilweise auch. Hier erfolgt eine Expansion von
-// Platzhaltern im Pfad.
+// Rest vom MG ruft es teilweise auch.
string make_path_absolute(string path) {
- return normalize_path(path, getuid(TI || TP), 1);
+ return implode(path_array(path),"/");
}
static int project_access(string user, string project)
@@ -222,23 +175,23 @@
switch(fun) {
case "log_file":
- strs=path_array("/"+path, 0, 0);
+ strs=path_array("/"+path);
path = implode(strs, "/");
strs -= ({""}); // remove trailing and leading "/".
if (sizeof(strs)>1 && strs[0]=="log") return path;
return 0;
case "save_object":
if (!sizeof(path)) return 0;
- strs=path_array("/"+path, 0, 0);
+ strs=path_array("/"+path);
break;
case "ed_start":
if (sizeof(path))
- strs=path_array(path, euid, 1);
+ strs=path_array(path);
else
strs=({"players",euid,".err"});
break;
default:
- strs=path_array(path, euid, 0);
+ strs=path_array(path);
}
if (!euid || euid=="NOBODY" || euid=="ftp" || euid=="anonymous") return 0;
@@ -439,7 +392,7 @@
if (!euid) euid="-";
- strs=path_array(path, euid, 0);
+ strs=path_array(path);
// Pfade sind ab jetzt auf jeden Fall absolut.
path=implode(strs, "/");
diff --git a/std/util/path.c b/std/util/path.c
new file mode 100644
index 0000000..3ae07b8
--- /dev/null
+++ b/std/util/path.c
@@ -0,0 +1,59 @@
+#pragma strict_types, rtt_checks, pedantic, range_check, no_clone
+
+#include <config.h>
+#include <shells.h>
+#include <defines.h>
+
+// Ersetzt Platzhalter im Pfad und versorgt relative Pfade mit P_CURRENTDIR
+// Funktionalitaet war mal im master() in der Rechtepruefung, gehoert da aber
+// wirklich nicht hin.
+string expand_path(string path, string user)
+{
+ string cwd;
+ if (!sizeof(path))
+ return path;
+ switch(path[0])
+ {
+ // expand nur fuer nicht-absolute Pfade
+ case '/':
+ break;
+ case '+':
+ if(sizeof(path)==1)
+ path="/"DOMAINDIR;
+ path="/"DOMAINDIR"/" + path[1..];
+ break;
+ case '~':
+ if (sizeof(path)==1)
+ {
+ if(user)
+ path="/"WIZARDDIR"/"+user;
+ else
+ path="/"WIZARDDIR;
+ }
+ else
+ {
+ if(user && sizeof(path)>1 && path[1]=='/') // "~/"
+ path="/"WIZARDDIR"/" + user + "/" + path[2..];
+ else
+ path="/"WIZARDDIR"/" + path[1..];
+ }
+ break;
+ default:
+ if(user && PL && getuid(PL) == user
+ && (cwd=(string)PL->QueryProp(P_CURRENTDIR)))
+ path=cwd + "/" + path;
+ }
+ return path;
+}
+
+// Besser benamste Version von _get_path() aus master().
+// Normalisiert den Pfad, expandiert Platzhalter auf Wunsch, benutzt ggf. RPL
+// oder PL als User, wenn nicht angegeben.
+varargs string normalize_path(string path, string user, int expand) {
+ if (!user && (RPL || PL))
+ user = getuid(RPL || PL);
+ if (expand)
+ path=expand_path(path, user);
+ return implode(master()->path_array(path), "/");
+}
+