Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/branches/SMLNJ/src/compiler/PervEnv/Unix/os-filesys.sml
ViewVC logotype

Annotation of /sml/branches/SMLNJ/src/compiler/PervEnv/Unix/os-filesys.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 143 - (view) (download)

1 : monnier 16 (* os-filesys.sml
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     * The Posix implementation of the generic file system interface.
6 :     *
7 :     *)
8 :    
9 :     structure OS_FileSys : OS_FILE_SYS =
10 :     struct
11 :    
12 :     structure P_FSys = Posix.FileSys
13 :    
14 :     val sysWordToWord = Word.fromLargeWord o SysWord.toLargeWord
15 :    
16 :     type dirstream = P_FSys.dirstream
17 :    
18 :     val openDir = P_FSys.opendir
19 :     val readDir = P_FSys.readdir
20 :     val rewindDir = P_FSys.rewinddir
21 :     val closeDir = P_FSys.closedir
22 :    
23 :     val chDir = P_FSys.chdir
24 :     val getDir = P_FSys.getcwd
25 :     local
26 :     structure S = P_FSys.S
27 :     val mode777 = S.flags[S.irwxu, S.irwxg, S.irwxo]
28 :     in
29 :     fun mkDir path = P_FSys.mkdir(path, mode777)
30 :     end
31 :     val rmDir = P_FSys.rmdir
32 :     val isDir = P_FSys.ST.isDir o P_FSys.stat
33 :    
34 :     val isLink = P_FSys.ST.isLink o P_FSys.lstat
35 :     val readLink = P_FSys.readlink
36 :    
37 :     (* the maximum number of links allowed *)
38 :     val maxLinks = 64
39 :    
40 :     structure P = OS_Path
41 :    
42 :     (* A UNIX specific implementation of fullPath *)
43 :     fun fullPath p = let
44 :     val oldCWD = getDir()
45 :     fun mkPath pathFromRoot =
46 :     P.toString{isAbs=true, vol="", arcs=List.rev pathFromRoot}
47 :     fun walkPath (0, _, _) = raise Assembly.SysErr("too many links", NONE)
48 :     | walkPath (n, pathFromRoot, []) =
49 :     mkPath pathFromRoot
50 :     | walkPath (n, pathFromRoot, ""::al) =
51 :     walkPath (n, pathFromRoot, al)
52 :     | walkPath (n, pathFromRoot, "."::al) =
53 :     walkPath (n, pathFromRoot, al)
54 :     | walkPath (n, [], ".."::al) =
55 :     walkPath (n, [], al)
56 :     | walkPath (n, _::r, ".."::al) = (
57 :     chDir ".."; walkPath (n, r, al))
58 :     | walkPath (n, pathFromRoot, [arc]) =
59 :     if (isLink arc)
60 :     then expandLink (n, pathFromRoot, arc, [])
61 :     else mkPath (arc::pathFromRoot)
62 :     | walkPath (n, pathFromRoot, arc::al) =
63 :     if (isLink arc)
64 :     then expandLink (n, pathFromRoot, arc, al)
65 :     else (chDir arc; walkPath (n, arc::pathFromRoot, al))
66 :     and expandLink (n, pathFromRoot, link, rest) = (
67 :     case (P.fromString(readLink link))
68 :     of {isAbs=false, arcs, ...} =>
69 :     walkPath (n-1, pathFromRoot, List.@(arcs, rest))
70 :     | {isAbs=true, arcs, ...} =>
71 :     gotoRoot (n-1, List.@(arcs, rest))
72 :     (* end case *))
73 :     and gotoRoot (n, arcs) = (
74 :     chDir "/";
75 :     walkPath (n, [], arcs))
76 :     fun computeFullPath arcs =
77 :     (gotoRoot(maxLinks, arcs) before chDir oldCWD)
78 :     handle ex => (chDir oldCWD; raise ex)
79 :     in
80 :     case (P.fromString p)
81 :     of {isAbs=false, arcs, ...} => let
82 :     val {arcs=arcs', ...} = P.fromString(oldCWD)
83 :     in
84 :     computeFullPath (List.@(arcs', arcs))
85 :     end
86 :     | {isAbs=true, arcs, ...} => computeFullPath arcs
87 :     (* end case *)
88 :     end
89 :    
90 :     fun realPath p = if (P.isAbsolute p)
91 :     then fullPath p
92 : monnier 143 else P.mkRelative {path=fullPath p, relativeTo=fullPath(getDir())}
93 : monnier 16
94 :     val fileSize = P_FSys.ST.size o P_FSys.stat
95 :     val modTime = P_FSys.ST.mtime o P_FSys.stat
96 :     fun setTime (path, NONE) = P_FSys.utime(path, NONE)
97 :     | setTime (path, SOME t) = P_FSys.utime(path, SOME{actime=t, modtime=t})
98 :     val remove = P_FSys.unlink
99 :     val rename = P_FSys.rename
100 :    
101 :     structure A : sig
102 :     datatype access_mode = A_READ | A_WRITE | A_EXEC
103 :     end = Posix.FileSys
104 :     open A
105 :    
106 :     fun access (path, al) = let
107 :     fun cvt A_READ = P_FSys.A_READ
108 :     | cvt A_WRITE = P_FSys.A_WRITE
109 :     | cvt A_EXEC = P_FSys.A_EXEC
110 :     in
111 :     P_FSys.access (path, List.map cvt al)
112 :     end
113 :    
114 :     val tmpName : unit -> string = CInterface.c_function "POSIX-OS" "tmpname"
115 :    
116 :     datatype file_id = FID of {dev : SysWord.word, ino : SysWord.word}
117 :    
118 :     fun fileId fname = let
119 :     val st = P_FSys.stat fname
120 :     in
121 :     FID{
122 :     dev = P_FSys.devToWord(P_FSys.ST.dev st),
123 :     ino = P_FSys.inoToWord(P_FSys.ST.ino st)
124 :     }
125 :     end
126 :    
127 :     fun hash (FID{dev, ino}) = sysWordToWord(
128 :     SysWord.+(SysWord.<<(dev, 0w16), ino))
129 :    
130 :     fun compare (FID{dev=d1, ino=i1}, FID{dev=d2, ino=i2}) =
131 :     if (SysWord.<(d1, d2))
132 :     then General.LESS
133 :     else if (SysWord.>(d1, d2))
134 :     then General.GREATER
135 :     else if (SysWord.<(i1, i2))
136 :     then General.LESS
137 :     else if (SysWord.>(i1, i2))
138 :     then General.GREATER
139 :     else General.EQUAL
140 :    
141 :     end;
142 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0