osutil.py
102 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
Jun Wu
|
r30346 | from __future__ import absolute_import | ||
import cffi | ||||
ffi = cffi.FFI() | ||||
ffi.set_source("_osutil_cffi", """ | ||||
#include <sys/attr.h> | ||||
#include <sys/vnode.h> | ||||
#include <unistd.h> | ||||
#include <fcntl.h> | ||||
#include <time.h> | ||||
typedef struct val_attrs { | ||||
uint32_t length; | ||||
attribute_set_t returned; | ||||
attrreference_t name_info; | ||||
fsobj_type_t obj_type; | ||||
struct timespec mtime; | ||||
uint32_t accessmask; | ||||
off_t datalength; | ||||
} __attribute__((aligned(4), packed)) val_attrs_t; | ||||
""", include_dirs=['mercurial']) | ||||
ffi.cdef(''' | ||||
typedef uint32_t attrgroup_t; | ||||
typedef struct attrlist { | ||||
uint16_t bitmapcount; /* number of attr. bit sets in list */ | ||||
uint16_t reserved; /* (to maintain 4-byte alignment) */ | ||||
attrgroup_t commonattr; /* common attribute group */ | ||||
attrgroup_t volattr; /* volume attribute group */ | ||||
attrgroup_t dirattr; /* directory attribute group */ | ||||
attrgroup_t fileattr; /* file attribute group */ | ||||
attrgroup_t forkattr; /* fork attribute group */ | ||||
...; | ||||
}; | ||||
typedef struct attribute_set { | ||||
...; | ||||
} attribute_set_t; | ||||
typedef struct attrreference { | ||||
int attr_dataoffset; | ||||
int attr_length; | ||||
...; | ||||
} attrreference_t; | ||||
typedef int ... off_t; | ||||
typedef struct val_attrs { | ||||
uint32_t length; | ||||
attribute_set_t returned; | ||||
attrreference_t name_info; | ||||
uint32_t obj_type; | ||||
struct timespec mtime; | ||||
uint32_t accessmask; | ||||
off_t datalength; | ||||
...; | ||||
} val_attrs_t; | ||||
/* the exact layout of the above struct will be figured out during build time */ | ||||
typedef int ... time_t; | ||||
typedef struct timespec { | ||||
time_t tv_sec; | ||||
...; | ||||
}; | ||||
int getattrlist(const char* path, struct attrlist * attrList, void * attrBuf, | ||||
size_t attrBufSize, unsigned int options); | ||||
int getattrlistbulk(int dirfd, struct attrlist * attrList, void * attrBuf, | ||||
size_t attrBufSize, uint64_t options); | ||||
#define ATTR_BIT_MAP_COUNT ... | ||||
#define ATTR_CMN_NAME ... | ||||
#define ATTR_CMN_OBJTYPE ... | ||||
#define ATTR_CMN_MODTIME ... | ||||
#define ATTR_CMN_ACCESSMASK ... | ||||
#define ATTR_CMN_ERROR ... | ||||
#define ATTR_CMN_RETURNED_ATTRS ... | ||||
#define ATTR_FILE_DATALENGTH ... | ||||
#define VREG ... | ||||
#define VDIR ... | ||||
#define VLNK ... | ||||
#define VBLK ... | ||||
#define VCHR ... | ||||
#define VFIFO ... | ||||
#define VSOCK ... | ||||
#define S_IFMT ... | ||||
int open(const char *path, int oflag, int perm); | ||||
int close(int); | ||||
#define O_RDONLY ... | ||||
''') | ||||
if __name__ == '__main__': | ||||
ffi.compile() | ||||