本文整理汇总了C++中DECL_G函数的典型用法代码示例。如果您正苦于以下问题:C++ DECL_G函数的具体用法?C++ DECL_G怎么用?C++ DECL_G使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了DECL_G函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: mount_local_access
/* Nautilus loves to use access(2) to test everything about a file,
* such as whether it's executable. Therefore treat this a lot like
* mount_local_getattr.
*/
static int
mount_local_access (const char *path, int mask)
{
struct stat statbuf;
int r;
struct fuse_context *fuse;
int ok = 1;
DECL_G ();
DEBUG_CALL ("%s, %d", path, mask);
if (g->ml_read_only && (mask & W_OK))
return -EROFS;
r = mount_local_getattr (path, &statbuf);
if (r < 0 || mask == F_OK) {
debug (g, "%s: mount_local_getattr returned r = %d", path, r);
return r;
}
fuse = fuse_get_context ();
/* Root user should be able to access everything, so only bother
* with these fine-grained tests for non-root. (RHBZ#1106548).
*/
if (fuse->uid != 0) {
if (mask & R_OK)
ok = ok &&
( fuse->uid == statbuf.st_uid ? statbuf.st_mode & S_IRUSR
: fuse->gid == statbuf.st_gid ? statbuf.st_mode & S_IRGRP
: statbuf.st_mode & S_IROTH);
if (mask & W_OK)
ok = ok &&
( fuse->uid == statbuf.st_uid ? statbuf.st_mode & S_IWUSR
: fuse->gid == statbuf.st_gid ? statbuf.st_mode & S_IWGRP
: statbuf.st_mode & S_IWOTH);
if (mask & X_OK)
ok = ok &&
( fuse->uid == statbuf.st_uid ? statbuf.st_mode & S_IXUSR
: fuse->gid == statbuf.st_gid ? statbuf.st_mode & S_IXGRP
: statbuf.st_mode & S_IXOTH);
}
debug (g, "%s: "
"testing access mask%s%s%s%s: "
"caller UID:GID = %ju:%ju, "
"file UID:GID = %ju:%ju, "
"file mode = %o, "
"result = %s",
path,
mask & R_OK ? " R_OK" : "",
mask & W_OK ? " W_OK" : "",
mask & X_OK ? " X_OK" : "",
mask == 0 ? " 0" : "",
(uintmax_t) fuse->uid, (uintmax_t) fuse->gid,
(uintmax_t) statbuf.st_uid, (uintmax_t) statbuf.st_gid,
statbuf.st_mode,
ok ? "OK" : "EACCESS");
return ok ? 0 : -EACCES;
}
示例2: mount_local_read
static int
mount_local_read (const char *path, char *buf, size_t size, off_t offset,
struct fuse_file_info *fi)
{
char *r;
size_t rsize;
const size_t limit = 2 * 1024 * 1024;
DECL_G ();
DEBUG_CALL ("%s, %p, %zu, %ld", path, buf, size, (long) offset);
/* The guestfs protocol limits size to somewhere over 2MB. We just
* reduce the requested size here accordingly and push the problem
* up to every user. http://www.jwz.org/doc/worse-is-better.html
*/
if (size > limit)
size = limit;
r = guestfs_pread (g, path, size, offset, &rsize);
if (r == NULL)
RETURN_ERRNO;
/* This should never happen, but at least it stops us overflowing
* the output buffer if it does happen.
*/
if (rsize > size)
rsize = size;
memcpy (buf, r, rsize);
free (r);
return rsize;
}
示例3: mount_local_readlink
static int
mount_local_readlink (const char *path, char *buf, size_t size)
{
const char *r;
int free_it = 0;
size_t len;
DECL_G ();
DEBUG_CALL ("%s, %p, %zu", path, buf, size);
r = rlc_lookup (g, path);
if (!r) {
r = guestfs_readlink (g, path);
if (r == NULL)
RETURN_ERRNO;
free_it = 1;
}
/* Note this is different from the real readlink(2) syscall. FUSE wants
* the string to be always nul-terminated, even if truncated.
*/
len = strlen (r);
if (len > size - 1)
len = size - 1;
memcpy (buf, r, len);
buf[len] = '\0';
if (free_it) {
char *tmp = (char *) r;
free (tmp);
}
return 0;
}
示例4: mount_local_statfs
static int
mount_local_statfs (const char *path, struct statvfs *stbuf)
{
CLEANUP_FREE_STATVFS struct guestfs_statvfs *r;
DECL_G ();
DEBUG_CALL ("%s, %p", path, stbuf);
r = guestfs_statvfs (g, path);
if (r == NULL)
RETURN_ERRNO;
stbuf->f_bsize = r->bsize;
stbuf->f_frsize = r->frsize;
stbuf->f_blocks = r->blocks;
stbuf->f_bfree = r->bfree;
stbuf->f_bavail = r->bavail;
stbuf->f_files = r->files;
stbuf->f_ffree = r->ffree;
stbuf->f_favail = r->favail;
stbuf->f_fsid = r->fsid;
stbuf->f_flag = r->flag;
stbuf->f_namemax = r->namemax;
return 0;
}
示例5: mount_local_listxattr
/* Ditto as above. */
static int
mount_local_listxattr (const char *path, char *list, size_t size)
{
DECL_G ();
DEBUG_CALL ("%s, %p, %zu", path, list, size);
const struct guestfs_xattr_list *xattrs;
int free_attrs = 0;
xattrs = xac_lookup (g, path);
if (xattrs == NULL) {
xattrs = guestfs_lgetxattrs (g, path);
if (xattrs == NULL)
RETURN_ERRNO;
free_attrs = 1;
}
/* Calculate how much space is required to hold the result. */
size_t space = 0;
size_t len;
size_t i;
for (i = 0; i < xattrs->len; ++i) {
len = strlen (xattrs->val[i].attrname) + 1;
space += len;
}
/* The listxattr man page is unclear, but if list == NULL then we
* return the space required (the caller then makes a second syscall
* after allocating the required amount of space). If list != NULL
* then it's not clear what we should do, but it appears we should
* copy as much as possible and return -ERANGE if there's not enough
* space in the buffer.
*/
ssize_t r;
if (list == NULL) {
r = space;
goto out;
}
r = 0;
for (i = 0; i < xattrs->len; ++i) {
len = strlen (xattrs->val[i].attrname) + 1;
if (size >= len) {
memcpy (list, xattrs->val[i].attrname, len);
size -= len;
list += len;
r += len;
} else {
r = -ERANGE;
break;
}
}
out:
if (free_attrs)
guestfs_free_xattr_list ((struct guestfs_xattr_list *) xattrs);
return r;
}
示例6: mount_local_getxattr
/* The guestfs(3) API for getting xattrs is much easier to use
* than the real syscall. Unfortunately we now have to emulate
* the real syscall using that API :-(
*/
static int
mount_local_getxattr (const char *path, const char *name, char *value,
size_t size)
{
DECL_G ();
DEBUG_CALL ("%s, %s, %p, %zu", path, name, value, size);
const struct guestfs_xattr_list *xattrs;
int free_attrs = 0;
xattrs = xac_lookup (g, path);
if (xattrs == NULL) {
xattrs = guestfs_lgetxattrs (g, path);
if (xattrs == NULL)
RETURN_ERRNO;
free_attrs = 1;
}
/* Find the matching attribute (index in 'i'). */
ssize_t r;
size_t i;
for (i = 0; i < xattrs->len; ++i) {
if (STREQ (xattrs->val[i].attrname, name))
break;
}
if (i == xattrs->len) { /* not found */
r = -ENOATTR;
goto out;
}
/* The getxattr man page is unclear, but if value == NULL then we
* return the space required (the caller then makes a second syscall
* after allocating the required amount of space). If value != NULL
* then it's not clear what we should do, but it appears we should
* copy as much as possible and return -ERANGE if there's not enough
* space in the buffer.
*/
size_t sz = xattrs->val[i].attrval_len;
if (value == NULL) {
r = sz;
goto out;
}
if (sz <= size)
r = sz;
else {
r = -ERANGE;
sz = size;
}
memcpy (value, xattrs->val[i].attrval, sz);
out:
if (free_attrs)
guestfs_free_xattr_list ((struct guestfs_xattr_list *) xattrs);
return r;
}
示例7: mount_local_release
static int
mount_local_release (const char *path, struct fuse_file_info *fi)
{
DECL_G ();
DEBUG_CALL ("%s", path);
/* Just a stub. This method is optional and can safely be left
* unimplemented.
*/
return 0;
}
示例8: mount_local_open
/* All this function needs to do is to check that the requested open
* flags are valid. See the notes in <fuse/fuse.h>.
*/
static int
mount_local_open (const char *path, struct fuse_file_info *fi)
{
const int flags = fi->flags & O_ACCMODE;
DECL_G ();
DEBUG_CALL ("%s, 0%o", path, (unsigned) fi->flags);
if (g->ml_read_only && flags != O_RDONLY)
return -EROFS;
return 0;
}
示例9: mount_local_flush
static int
mount_local_flush(const char *path, struct fuse_file_info *fi)
{
DECL_G ();
DEBUG_CALL ("%s", path);
/* Just a stub. This method is called whenever FUSE wants to flush the
* pending changes (f.ex. to attributes) to a file. Since we don't have
* anything to do and don't want FUSE to think something went badly,
* just return 0.
*/
return 0;
}
示例10: mount_local_fsync
/* Emulate this by calling sync. */
static int
mount_local_fsync (const char *path, int isdatasync,
struct fuse_file_info *fi)
{
int r;
DECL_G ();
DEBUG_CALL ("%s, %d", path, isdatasync);
r = guestfs_sync (g);
if (r == -1)
RETURN_ERRNO;
return 0;
}
示例11: mount_local_truncate
static int
mount_local_truncate (const char *path, off_t size)
{
int r;
DECL_G ();
DEBUG_CALL ("%s, %ld", path, (long) size);
if (g->ml_read_only) return -EROFS;
dir_cache_invalidate (g, path);
r = guestfs_truncate_size (g, path, size);
if (r == -1)
RETURN_ERRNO;
return 0;
}
示例12: mount_local_chown
static int
mount_local_chown (const char *path, uid_t uid, gid_t gid)
{
int r;
DECL_G ();
DEBUG_CALL ("%s, %ju, %ju", path, (uintmax_t) uid, (uintmax_t) gid);
if (g->ml_read_only) return -EROFS;
dir_cache_invalidate (g, path);
r = guestfs_lchown (g, uid, gid, path);
if (r == -1)
RETURN_ERRNO;
return 0;
}
示例13: mount_local_symlink
static int
mount_local_symlink (const char *from, const char *to)
{
int r;
DECL_G ();
DEBUG_CALL ("%s, %s", from, to);
if (g->ml_read_only) return -EROFS;
dir_cache_invalidate (g, to);
r = guestfs_ln_s (g, from, to);
if (r == -1)
RETURN_ERRNO;
return 0;
}
示例14: mount_local_unlink
static int
mount_local_unlink (const char *path)
{
int r;
DECL_G ();
DEBUG_CALL ("%s", path);
if (g->ml_read_only) return -EROFS;
dir_cache_invalidate (g, path);
r = guestfs_rm (g, path);
if (r == -1)
RETURN_ERRNO;
return 0;
}
示例15: mount_local_mknod
static int
mount_local_mknod (const char *path, mode_t mode, dev_t rdev)
{
int r;
DECL_G ();
DEBUG_CALL ("%s, 0%o, 0x%jx", path, mode, (uintmax_t) rdev);
if (g->ml_read_only) return -EROFS;
dir_cache_invalidate (g, path);
r = guestfs_mknod (g, mode, major (rdev), minor (rdev), path);
if (r == -1)
RETURN_ERRNO;
return 0;
}