2008-04-24 Adele Peterson <adele@apple.com>
[WebKit-https.git] / WebCore / platform / posix / FileSystemPOSIX.cpp
1 /*
2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "FileSystem.h"
31
32 #include "CString.h"
33 #include "PlatformString.h"
34
35 #include <sys/stat.h>
36 #include <unistd.h>
37
38 namespace WebCore {
39
40 bool fileExists(const String& path)
41 {
42     if (path.isNull())
43         return false;
44
45     CString fsRep = fileSystemRepresentation(path);
46
47     if (!fsRep.data() || fsRep.data()[0] == '\0')
48         return false;
49
50     struct stat fileInfo;
51
52     // stat(...) returns 0 on successful stat'ing of the file, and non-zero in any case where the file doesn't exist or cannot be accessed
53     return !stat(fsRep.data(), &fileInfo);
54 }
55
56 bool deleteFile(const String& path)
57 {
58     CString fsRep = fileSystemRepresentation(path);
59
60     if (!fsRep.data() || fsRep.data()[0] == '\0')
61         return false;
62
63     // unlink(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
64     return !unlink(fsRep.data());
65 }
66
67 bool deleteEmptyDirectory(const String& path)
68 {
69     CString fsRep = fileSystemRepresentation(path);
70
71     if (!fsRep.data() || fsRep.data()[0] == '\0')
72         return false;
73
74     // rmdir(...) returns 0 on successful deletion of the path and non-zero in any other case (including invalid permissions or non-existent file)
75     return !rmdir(fsRep.data());
76 }
77
78 bool getFileSize(const String& path, long long& result)
79 {
80     CString fsRep = fileSystemRepresentation(path);
81
82     if (!fsRep.data() || fsRep.data()[0] == '\0')
83         return false;
84
85     struct stat fileInfo;
86
87     if (stat(fsRep.data(), &fileInfo))
88         return false;
89
90     result = fileInfo.st_size;
91     return true;
92 }
93
94 bool getFileModificationTime(const String& path, time_t& result)
95 {
96     CString fsRep = fileSystemRepresentation(path);
97
98     if (!fsRep.data() || fsRep.data()[0] == '\0')
99         return false;
100
101     struct stat fileInfo;
102
103     if (stat(fsRep.data(), &fileInfo))
104         return false;
105
106     result = fileInfo.st_mtime;
107     return true;
108 }
109
110 String pathByAppendingComponent(const String& path, const String& component)
111 {
112     if (path.endsWith("/"))
113         return path + component;
114     else
115         return path + "/" + component;
116 }
117
118 bool makeAllDirectories(const String& path)
119 {
120     CString fullPath = fileSystemRepresentation(path);
121     if (!access(fullPath.data(), F_OK))
122         return true;
123
124     char* p = fullPath.mutableData() + 1;
125     int length = fullPath.length();
126
127     if(p[length - 1] == '/')
128         p[length - 1] = '\0';
129     for (; *p; ++p)
130         if (*p == '/') {
131             *p = '\0';
132             if (access(fullPath.data(), F_OK))
133                 if (mkdir(fullPath.data(), S_IRWXU))
134                     return false;
135             *p = '/';
136         }
137     if (access(fullPath.data(), F_OK))
138         if (mkdir(fullPath.data(), S_IRWXU))
139             return false;
140
141     return true;
142 }
143
144 String pathGetFileName(const String& path)
145 {
146     return path.substring(path.reverseFind('/') + 1);
147 }
148
149 } // namespace WebCore