00001 #ifndef __fs_h__
00002 #define __fs_h__
00003
00004 #include <iostream>
00005 #include <string>
00006 #include <vector>
00007
00008 #ifdef HAVE_SYS_TYPES_H
00009 #include <sys/types.h>
00010 #endif
00011 #ifdef HAVE_SYS_STAT_H
00012 #include <sys/stat.h>
00013 #endif
00014 #ifdef HAVE_UNISTD_H
00015 #include <unistd.h>
00016 #endif
00017 #include <pwd.h>
00018 #include <grp.h>
00019 #ifdef HAVE_SYS_PARAM_H
00020 #include <sys/param.h>
00021 #endif
00022 #ifdef HAVE_SYS_MOUNT_H
00023 #include <sys/mount.h>
00024 #endif
00025 #ifdef HAVE_SIGNAL_H
00026 #include <signal.h>
00027 #endif
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifdef HAVE_SYS_STATVFS_H
00038 # ifdef sun
00039 # ifdef _FILE_OFFSET_BITS
00040 # if _FILE_OFFSET_BITS == 64
00041 # define __HOLD_FILE_OFFSET_BITS_64
00042 # undef _FILE_OFFSET_BITS
00043 # endif
00044 # endif
00045 # endif
00046 #include <sys/statvfs.h>
00047 # ifdef __HOLD_FILE_OFFSET_BITS_64
00048 # define _FILE_OFFSET_BITS 64
00049 # undef __HOLD_FILE_OFFSET_BITS_64
00050 # endif
00051 #endif
00052
00053 #ifdef HAVE_SYS_VFS_H
00054 #include <sys/vfs.h>
00055 #endif
00056
00057 #include "types.h"
00058
00059 #ifdef HAVE_SYS_STATVFS_H
00060 #define STATFS statvfs
00061 #else
00062 #define STATFS statfs
00063 #endif
00064
00065 #include <string.h>
00066
00067 const std::string cwd(void);
00068 const pid_t pid(void);
00069 const pid_t parent_pid(void);
00070
00071 bool absolute_path(const std::string& a_path);
00072 bool relative_path(const std::string& a_path);
00073 std::string reform_path(const std::string& a_path);
00074 std::string permute_path(const std::string& a_path);
00075 std::string path_basename(const std::string& a_path);
00076 std::string path_dirname(const std::string& a_path);
00077 std::string mk_absolute_path(
00078 const std::string a_path,
00079 const std::string a_rel_path
00080 );
00081 std::string mk_relative_path(
00082 const std::string a_path_to,
00083 const std::string a_path_from
00084 );
00085 bool exists(const std::string& a_path);
00086 bool readable(const std::string& a_path);
00087 bool writable(const std::string& a_path);
00088 bool executable(const std::string& a_path);
00089 #ifdef S_ISFIFO
00090 bool is_fifo_special(const std::string& a_path);
00091 #endif
00092 #ifdef S_ISCHR
00093 bool is_char_special(const std::string& a_path);
00094 #endif
00095 #ifdef S_ISDIR
00096 bool is_dir(const std::string& a_path);
00097 #endif
00098 #ifdef S_ISREG
00099 bool is_file(const std::string& a_path);
00100 #endif
00101 #ifdef S_ISBLK
00102 bool is_block_special(const std::string& a_path);
00103 #endif
00104 #ifdef S_ISLNK
00105 bool is_link(const std::string& a_path);
00106 #endif
00107 #ifdef S_ISSOCK
00108 bool is_socket(const std::string& a_path);
00109 #endif
00110 #ifdef S_ISDOOR
00111 bool is_door(const std::string& a_path);
00112 #endif
00113 void mk_dir(const std::string& a_path);
00114 void rm_dir(const std::string a_path);
00115 void rm_file(const std::string a_path);
00116 void mk_dirhier(const std::string a_path);
00117 void rename_file(const std::string a_from, const std::string a_to);
00118 void mk_symlink(const std::string a_from, const std::string a_to);
00119 void mk_relative_symlink(const std::string a_from, const std::string a_to);
00120
00121
00122 class filestatus
00123 {
00124 public:
00125 enum filetype {
00126 #ifdef S_ISFIFO
00127 type_fifo_special,
00128 #endif
00129 #ifdef S_ISCHR
00130 type_character_special,
00131 #endif
00132 #ifdef S_ISDIR
00133 type_directory,
00134 #endif
00135 #ifdef S_ISREG
00136 type_regular_file,
00137 #endif
00138 #ifdef S_ISBLK
00139 type_block_special,
00140 #endif
00141 #ifdef S_ISLNK
00142 type_link,
00143 #endif
00144 #ifdef S_ISSOCK
00145 type_socket,
00146 #endif
00147 #ifdef S_ISDOOR
00148 type_door,
00149 #endif
00150 type_unknown
00151 };
00152 typedef mode_t mode_type;
00153 typedef ino_t inode_type;
00154 typedef dev_t device_type;
00155 typedef uint32 major_type;
00156 typedef uint32 minor_type;
00157 typedef nlink_t num_links_type;
00158 typedef uid_t uid_type;
00159 typedef gid_t gid_type;
00160 typedef uint64 size_type;
00161 typedef time_t time_type;
00162
00163 filestatus();
00164 filestatus(const std::string a_path);
00165 ~filestatus();
00166
00167 void path(const std::string a_path);
00168 const std::string path(void) const;
00169 const filetype type(void) const;
00170 const std::string link(void) const;
00171
00172 const mode_type mode(void) const;
00173 const inode_type inode(void) const;
00174 const device_type dev(void) const;
00175 const device_type rdev(void) const;
00176 const major_type get_major(void) const;
00177 const minor_type get_minor(void) const;
00178 const num_links_type num_links(void) const;
00179 const uid_type uid(void) const;
00180 const gid_type gid(void) const;
00181 const size_type size(void) const;
00182 const time_type last_access_time(void) const;
00183 const time_type last_modification_time(void) const;
00184 const time_type last_status_change_time(void) const;
00185 const size_type blocksize(void) const;
00186 const size_type blocks(void) const;
00187 const bool uid_is_found(void) const;
00188 const bool gid_is_found(void) const;
00189 const std::string uid_name(void) const;
00190 const std::string gid_name(void) const;
00191
00192 void clear(void);
00193
00194 #ifdef S_ISFIFO
00195 const bool is_fifo_special(void) const;
00196 #endif
00197 #ifdef S_ISCHR
00198 const bool is_character_special(void) const;
00199 #endif
00200 #ifdef S_ISBLK
00201 const bool is_block_special(void) const;
00202 #endif
00203 #ifdef S_ISLNK
00204 const bool is_link(void) const;
00205 #endif
00206 #ifdef S_ISSOCK
00207 const bool is_socket(void) const;
00208 #endif
00209 #ifdef S_ISDOOR
00210 const bool is_door(void) const;
00211 #endif
00212 #ifdef S_ISDIR
00213 const bool is_directory(void) const;
00214 #endif
00215 #ifdef S_ISREG
00216 const bool is_regular_file(void) const;
00217 #endif
00218
00219 #ifdef S_IRUSR
00220 const bool user_can_read(void) const;
00221 #endif
00222 #ifdef S_IWUSR
00223 const bool user_can_write(void) const;
00224 #endif
00225 #ifdef S_IXUSR
00226 const bool user_can_execute(void) const;
00227 #endif
00228 #ifdef S_IRGRP
00229 const bool group_can_read(void) const;
00230 #endif
00231 #ifdef S_IWGRP
00232 const bool group_can_write(void) const;
00233 #endif
00234 #ifdef S_IXGRP
00235 const bool group_can_execute(void) const;
00236 #endif
00237 #ifdef S_IROTH
00238 const bool other_can_read(void) const;
00239 #endif
00240 #ifdef S_IWOTH
00241 const bool other_can_write(void) const;
00242 #endif
00243 #ifdef S_IXOTH
00244 const bool other_can_execute(void) const;
00245 #endif
00246 #ifdef S_ISUID
00247 const bool is_set_uid(void) const;
00248 #endif
00249 #ifdef S_ISGID
00250 const bool is_set_gid(void) const;
00251 #endif
00252 #ifdef S_ISVTX
00253 const bool is_set_sticky(void) const;
00254 #endif
00255
00256 private:
00257 std::string m_path;
00258 struct stat m_stat;
00259 std::string m_link;
00260 major_type m_major;
00261 minor_type m_minor;
00262 bool m_uidfound;
00263 bool m_gidfound;
00264 std::string m_uname;
00265 std::string m_gname;
00266 };
00267
00268
00269
00270
00271
00272
00273 class subdirectory : public std::vector<std::string>
00274 {
00275 public:
00276 typedef std::vector<std::string> type;
00277
00278 subdirectory();
00279 subdirectory(const subdirectory& a_class);
00280 subdirectory(const std::string a_path, const std::string a_filter = "*");
00281 ~subdirectory();
00282
00283 void assign(const subdirectory& a_class);
00284
00285 const type&
00286 path(const std::string a_path, const std::string a_filter = "*");
00287
00288 subdirectory& operator=(const subdirectory& a_class);
00289
00290 private:
00291 };
00292
00293 void rm_recursive(const std::string a_path);
00294
00295
00296
00297
00298
00299
00300 class directory : public std::vector<std::string>
00301 {
00302 public:
00303 typedef std::vector<std::string> type;
00304
00305 directory();
00306 directory(const directory& a_class);
00307 directory(const std::string& a_str);
00308 ~directory();
00309
00310 const type& path(const std::string& a_path);
00311
00312 private:
00313 };
00314
00315
00316 class filesystem {
00317 public:
00318 typedef uint64 size_type;
00319
00320 filesystem();
00321 filesystem(const std::string& a_path);
00322
00323 void clear(void);
00324
00325 void path(const std::string& a_path);
00326 const std::string path(void) const;
00327 const size_type blocksize(void) const;
00328 const size_type total_blocks(void) const;
00329 const size_type free_blocks(void) const;
00330 const size_type used_blocks(void) const;
00331 const size_type total_inodes(void) const;
00332 const size_type free_inodes(void) const;
00333 const size_type used_inodes(void) const;
00334
00335 filesystem& operator=(const filesystem& a_class);
00336
00337 private:
00338 std::string m_path;
00339 struct STATFS m_statfs;
00340 };
00341
00342
00343 class simple_lock {
00344 public:
00345 typedef pid_t pid_type;
00346
00347 simple_lock();
00348 simple_lock(const std::string& a_lockfile);
00349 ~simple_lock();
00350
00351 void clear(void);
00352
00353 void lockfile(const std::string& a_lockfile);
00354 const std::string lockfile(void) const;
00355
00356 const pid_type locked_by(void) const;
00357 const bool is_locked(void) const;
00358 bool lock(void);
00359 void unlock(void);
00360 private:
00361 std::string m_lockfile;
00362 };
00363
00364 #endif