• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Collabora, Ltd. All rights reserved.
4  * Copyright (C) 2008 Kenneth Rohde Christiansen.
5  * Copyright (C) 2009-2010 ProFUSION embedded systems
6  * Copyright (C) 2009-2010 Samsung Electronics
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1.  Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  * 2.  Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
18  *     its contributors may be used to endorse or promote products derived
19  *     from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include "config.h"
34 #include "FileSystem.h"
35 
36 #include "NotImplemented.h"
37 
38 #include <Ecore.h>
39 #include <Ecore_File.h>
40 #include <Eina.h>
41 #include <dirent.h>
42 #include <dlfcn.h>
43 #include <errno.h>
44 #include <fnmatch.h>
45 #if ENABLE(GLIB_SUPPORT)
46 #include <glib.h> // TODO: remove me after following TODO is solved.
47 #endif
48 #include <limits.h>
49 #include <stdio.h>
50 #include <sys/stat.h>
51 #include <unistd.h>
52 #include <wtf/text/CString.h>
53 
54 namespace WebCore {
55 
fileSystemRepresentation(const String & path)56 CString fileSystemRepresentation(const String& path)
57 {
58 // WARNING: this is just used by platform/network/soup, thus must be GLIB!!!
59 // TODO: move this to CString and use it instead in both, being more standard
60 #if !PLATFORM(WIN_OS) && defined(WTF_USE_SOUP)
61     char* filename = g_uri_unescape_string(path.utf8().data(), 0);
62     CString cfilename(filename);
63     g_free(filename);
64     return cfilename;
65 #else
66     return path.utf8();
67 #endif
68 }
69 
openTemporaryFile(const String & prefix,PlatformFileHandle & handle)70 String openTemporaryFile(const String& prefix, PlatformFileHandle& handle)
71 {
72     char buffer[PATH_MAX];
73     const char* tmpDir = getenv("TMPDIR");
74 
75     if (!tmpDir)
76         tmpDir = "/tmp";
77 
78     if (snprintf(buffer, PATH_MAX, "%s/%sXXXXXX", tmpDir, prefix.utf8().data()) >= PATH_MAX)
79         goto end;
80 
81     handle = mkstemp(buffer);
82     if (handle < 0)
83         goto end;
84 
85     return String::fromUTF8(buffer);
86 
87 end:
88     handle = invalidPlatformFileHandle;
89     return String();
90 }
91 
unloadModule(PlatformModule module)92 bool unloadModule(PlatformModule module)
93 {
94     // caution, closing handle will make memory vanish and any remaining
95     // timer, idler, threads or any other left-over will crash,
96     // maybe just ignore this is a safer solution?
97     return !dlclose(module);
98 }
99 
homeDirectoryPath()100 String homeDirectoryPath()
101 {
102     const char *home = getenv("HOME");
103     if (!home) {
104         home = getenv("TMPDIR");
105         if (!home)
106             home = "/tmp";
107     }
108     return String::fromUTF8(home);
109 }
110 
listDirectory(const String & path,const String & filter)111 Vector<String> listDirectory(const String& path, const String& filter)
112 {
113     Vector<String> entries;
114     CString cpath = path.utf8();
115     CString cfilter = filter.utf8();
116     char filePath[PATH_MAX];
117     char* fileName;
118     size_t fileNameSpace;
119     DIR* dir;
120 
121     if (cpath.length() + NAME_MAX >= sizeof(filePath))
122         return entries;
123     // loop invariant: directory part + '/'
124     memcpy(filePath, cpath.data(), cpath.length());
125     fileName = filePath + cpath.length();
126     if (cpath.length() > 0 && filePath[cpath.length() - 1] != '/') {
127         fileName[0] = '/';
128         fileName++;
129     }
130     fileNameSpace = sizeof(filePath) - (fileName - filePath) - 1;
131 
132     dir = opendir(cpath.data());
133     if (!dir)
134         return entries;
135 
136     struct dirent* de;
137     while (de = readdir(dir)) {
138         size_t nameLen;
139         if (de->d_name[0] == '.') {
140             if (de->d_name[1] == '\0')
141                 continue;
142             if (de->d_name[1] == '.' && de->d_name[2] == '\0')
143                 continue;
144         }
145         if (fnmatch(cfilter.data(), de->d_name, 0))
146             continue;
147 
148         nameLen = strlen(de->d_name);
149         if (nameLen >= fileNameSpace)
150             continue; // maybe assert? it should never happen anyway...
151 
152         memcpy(fileName, de->d_name, nameLen + 1);
153         entries.append(filePath);
154     }
155     closedir(dir);
156     return entries;
157 }
158 
159 }
160