source: XMLIO_V2/external/src/POCO/Foundation/Path_UNIX.hpp @ 80

Last change on this file since 80 was 80, checked in by ymipsl, 14 years ago

ajout lib externe

File size: 3.6 KB
Line 
1//
2// Path_UNIX.cpp
3//
4// $Id: //poco/1.3/Foundation/src/Path_UNIX.cpp#2 $
5//
6// Library: Foundation
7// Package: Filesystem
8// Module:  Path
9//
10// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
11// and Contributors.
12//
13// Permission is hereby granted, free of charge, to any person or organization
14// obtaining a copy of the software and accompanying documentation covered by
15// this license (the "Software") to use, reproduce, display, distribute,
16// execute, and transmit the Software, and to prepare derivative works of the
17// Software, and to permit third-parties to whom the Software is furnished to
18// do so, all subject to the following:
19//
20// The copyright notices in the Software and this entire statement, including
21// the above license grant, this restriction and the following disclaimer,
22// must be included in all copies of the Software, in whole or in part, and
23// all derivative works of the Software, unless such copies or derivative
24// works are solely in the form of machine-executable object code generated by
25// a source language processor.
26//
27// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
28// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
29// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
30// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
31// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
32// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
33// DEALINGS IN THE SOFTWARE.
34//
35
36
37#include <Poco/Path_UNIX.h>
38#include <Poco/Exception.h>
39#include <Poco/Environment_UNIX.h>
40#include <unistd.h>
41#include <stdlib.h>
42#include <sys/types.h>
43#include <pwd.h>
44#include <cctype>
45#include <climits>
46
47
48#ifndef PATH_MAX
49#define PATH_MAX 1024 // fallback
50#endif
51
52
53namespace Poco {
54
55
56std::string PathImpl::currentImpl()
57{
58        std::string path;
59        char cwd[PATH_MAX];
60        if (getcwd(cwd, sizeof(cwd)))
61                path = cwd;
62        else
63                throw SystemException("cannot get current directory");
64        std::string::size_type n = path.size();
65        if (n > 0 && path[n - 1] != '/') path.append("/");
66        return path;
67}
68
69
70std::string PathImpl::homeImpl()
71{
72        std::string path;
73        struct passwd* pwd = getpwuid(getuid());
74        if (pwd)
75                path = pwd->pw_dir;
76        else
77        {
78                pwd = getpwuid(geteuid());
79                if (pwd)
80                        path = pwd->pw_dir;
81                else
82                        path = EnvironmentImpl::getImpl("HOME");
83        }
84        std::string::size_type n = path.size();
85        if (n > 0 && path[n - 1] != '/') path.append("/");
86        return path;
87}
88
89
90std::string PathImpl::tempImpl()
91{
92        std::string path;
93        char* tmp = getenv("TMPDIR");
94        if (tmp)
95        {
96                path = tmp;
97                std::string::size_type n = path.size();
98                if (n > 0 && path[n - 1] != '/') path.append("/");
99        }
100        else
101        {
102                path = "/tmp/";
103        }
104        return path;
105}
106
107
108std::string PathImpl::nullImpl()
109{
110        return "/dev/null";
111}
112
113
114std::string PathImpl::expandImpl(const std::string& path)
115{
116        std::string result;
117        std::string::const_iterator it  = path.begin();
118        std::string::const_iterator end = path.end();
119        if (it != end && *it == '~')
120        {
121                ++it;
122                if (it != end && *it == '/')
123                {
124                        result += homeImpl(); ++it;
125                }
126                else result += '~';
127        }
128        while (it != end)
129        {
130                if (*it == '$')
131                {
132                        std::string var;
133                        ++it;
134                        if (it != end && *it == '{')
135                        {
136                                ++it;
137                                while (it != end && *it != '}') var += *it++;
138                                if (it != end) ++it;
139                        }
140                        else
141                        {
142                                while (it != end && (std::isalnum(*it) || *it == '_')) var += *it++;
143                        }
144                        char* val = getenv(var.c_str());
145                        if (val) result += val;
146                }
147                else result += *it++;
148        }
149        return result;
150}
151
152
153void PathImpl::listRootsImpl(std::vector<std::string>& roots)
154{
155        roots.clear();
156        roots.push_back("/");
157}
158
159
160} // namespace Poco
Note: See TracBrowser for help on using the repository browser.