1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
/*
* HT Editor
* file.h
*
* File system functions
*
* Copyright (C) 1999-2004 Stefan Weyergraf (stefan@weyergraf.de)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __FILE_H__
#define __FILE_H__
/* Note: all functions only take absolute dir/filenames ! */
#include "types.h"
#include "fileofs.h"
#include <dirent.h>
#include <sys/types.h>
#include <time.h>
#ifdef PATH_MAX
#define HT_NAME_MAX PATH_MAX /* DJGPP at least */
#else
#ifdef MAXNAMLEN
#define HT_NAME_MAX MAXNAMLEN /* some BSD... */
#else
#ifdef NAME_MAX
#define HT_NAME_MAX NAME_MAX /* POSIX and friends... */
#else
#define HT_NAME_MAX 260 /* unknown... */
#endif
#endif
#endif
#define HT_S_IFREG 0x1000
#define HT_S_IFBLK 0x2000
#define HT_S_IFCHR 0x3000
#define HT_S_IFDIR 0x4000
#define HT_S_IFFIFO 0x5000
#define HT_S_IFLNK 0x6000
#define HT_S_IFSOCK 0x7000
#define HT_S_IFMT 0xf000
#define HT_S_ISREG(m) (((m) & HT_S_IFMT) == HT_S_IFREG)
#define HT_S_ISBLK(m) (((m) & HT_S_IFMT) == HT_S_IFBLK)
#define HT_S_ISCHR(m) (((m) & HT_S_IFMT) == HT_S_IFCHR)
#define HT_S_ISDIR(m) (((m) & HT_S_IFMT) == HT_S_IFDIR)
#define HT_S_ISFIFO(m) (((m) & HT_S_IFMT) == HT_S_IFFIFO)
#define HT_S_ISLNK(m) (((m) & HT_S_IFMT) == HT_S_IFLNK)
#define HT_S_ISSOCK(m) (((m) & HT_S_IFMT) == HT_S_IFSOCK)
#define HT_S_IRUSR 0x0100
#define HT_S_IRGRP 0x0020
#define HT_S_IROTH 0x0004
#define HT_S_IWUSR 0x0080
#define HT_S_IWGRP 0x0010
#define HT_S_IWOTH 0x0002
#define HT_S_IXUSR 0x0040
#define HT_S_IXGRP 0x0008
#define HT_S_IXOTH 0x0001
#define HT_S_IRWXU (HT_S_IRUSR || HT_S_IWUSR || HT_S_IXUSR)
#define HT_S_IRWXG (HT_S_IRGRP || HT_S_IWGRP || HT_S_IXGRP)
#define HT_S_IRWXO (HT_S_IROTH || HT_S_IWOTH || HT_S_IXOTH)
#define pstat_ctime 0x00000001
#define pstat_mtime 0x00000002
#define pstat_atime 0x00000004
#define pstat_uid 0x00000008
#define pstat_gid 0x00000010
#define pstat_mode_usr 0x00000020
#define pstat_mode_grp 0x00000040
#define pstat_mode_oth 0x00000080
#define pstat_mode_r 0x00000100
#define pstat_mode_w 0x00000200
#define pstat_mode_x 0x00000400
#define pstat_mode_type 0x00000800
#define pstat_size 0x00001000
#define pstat_inode 0x00002000
#define pstat_cluster 0x00004000
#define pstat_fsid 0x00008000
#define pstat_desc 0x00010000
#define pstat_mode_all (pstat_mode_usr|pstat_mode_grp|pstat_mode_oth|pstat_mode_r|pstat_mode_w|pstat_mode_x|pstat_mode_type)
struct pstat_t {
uint32 caps;
time_t ctime;
time_t mtime;
time_t atime;
uint uid;
uint gid;
mode_t mode; // S_ISUID, S_ISGID, S_I[RWX](USR|GRP|OTH)
uint64 size;
union {
uint inode;
uint cluster;
uint fsid;
};
char desc[32];
};
struct pfind_t {
const char *name;
pstat_t stat;
void *findstate;
};
typedef bool (*is_path_delim)(char c);
/* File open mode */
enum FileOpenMode {
FOM_EXISTS,
FOM_CREATE,
FOM_APPEND
};
/* Stream access mode */
enum IOAccessModeAtomic {
IOAM_NULL = 0,
IOAM_READ = 1,
IOAM_WRITE = 2
};
typedef uint IOAccessMode;
#define SYS_SEEK_SET 1
#define SYS_SEEK_REL 2
#define SYS_SEEK_END 3
// Add abstraction to files
#define SYS_FILE void
/* system-independant (implementation in sys.cc) */
int sys_file_mode(int mode);
int sys_basename(char *result, const char *filename);
char * sys_dirname(char *path);
char * sys_get_home_dir();
int sys_relname(char *result, const char *filename, const char *cwd);
int sys_common_canonicalize(char *result, const char *in_name, const char *cwd, is_path_delim delim);
char * sys_filename_suffix(const char *fn);
int sys_tmpfile_fd();
/* system-dependant (implementation in $MYSYSTEM/ *.cc) */
int sys_canonicalize(char **result, const char *filename);
int sys_findclose(pfind_t &pfind);
int sys_findfirst(pfind_t &pfind, const char *dirname);
int sys_findnext(pfind_t &pfind);
int sys_pstat(pstat_t &s, const char *filename);
int sys_pstat_fd(pstat_t &s, int fd);
int sys_pstat_file(pstat_t &s, SYS_FILE *file);
int sys_truncate(const char *filename, FileOfs ofs);
int sys_truncate_fd(int fd, FileOfs ofs);
int sys_deletefile(const char *filename);
bool sys_is_path_delim(char c);
int sys_filename_cmp(const char *a, const char *b);
bool sys_filename_is_absolute(const char *filename);
SYS_FILE * sys_fopen(const char *filename, FileOpenMode openmode, IOAccessMode accessmode);
SYS_FILE * sys_freopen(const char *filename, FileOpenMode openmode, IOAccessMode accessmode, SYS_FILE *file);
void sys_fclose(SYS_FILE *file);
int sys_fread(SYS_FILE *file, byte *buf, int size);
int sys_fwrite(SYS_FILE *file, byte *buf, int size);
int sys_fseek(SYS_FILE *file, FileOfs newofs, int seekmode = SYS_SEEK_SET);
FileOfs sys_ftell(SYS_FILE *file);
#endif /* __FILE_H__ */
|