static int mount_local_getattr (const char *path, struct stat *statbuf) { DECL_G (); DEBUG_CALL ("%s, %p", path, statbuf); const struct stat *buf; buf = lsc_lookup (g, path); if (buf) { memcpy (statbuf, buf, sizeof *statbuf); return 0; } struct guestfs_stat *r; r = guestfs_lstat (g, path); if (r == NULL) RETURN_ERRNO; statbuf->st_dev = r->dev; statbuf->st_ino = r->ino; statbuf->st_mode = r->mode; statbuf->st_nlink = r->nlink; statbuf->st_uid = r->uid; statbuf->st_gid = r->gid; statbuf->st_rdev = r->rdev; statbuf->st_size = r->size; statbuf->st_blksize = r->blksize; statbuf->st_blocks = r->blocks; statbuf->st_atime = r->atime; statbuf->st_mtime = r->mtime; statbuf->st_ctime = r->ctime; guestfs_free_stat (r); return 0; }
int main (int argc, char *argv[]) { guestfs_h *g; int r, err; struct guestfs_stat *stat; g = guestfs_create (); if (g == NULL) { fprintf (stderr, "failed to create handle\n"); exit (EXIT_FAILURE); } if (guestfs_add_drive_scratch (g, 524288000, -1) == -1) exit (EXIT_FAILURE); if (guestfs_launch (g) == -1) exit (EXIT_FAILURE); if (guestfs_part_disk (g, "/dev/sda", "mbr") == -1) exit (EXIT_FAILURE); if (guestfs_mkfs (g, "ext2", "/dev/sda1") == -1) exit (EXIT_FAILURE); /* Mount read-only, and check that errno == EROFS is passed back when * we create a file. */ if (guestfs_mount_ro (g, "/dev/sda1", "/") == -1) exit (EXIT_FAILURE); r = guestfs_touch (g, "/test"); if (r != -1) { fprintf (stderr, "guestfs_touch: expected error for read-only filesystem\n"); exit (EXIT_FAILURE); } err = guestfs_last_errno (g); if (err != EROFS) { fprintf (stderr, "guestfs_touch: expected errno == EROFS, but got %d\n", err); exit (EXIT_FAILURE); } if (guestfs_umount (g, "/") == -1) exit (EXIT_FAILURE); /* Mount it writable and test some other errors. */ if (guestfs_mount (g, "/dev/sda1", "/") == -1) exit (EXIT_FAILURE); stat = guestfs_lstat (g, "/nosuchfile"); if (stat != NULL) { fprintf (stderr, "guestfs_lstat: expected error for missing file\n"); exit (EXIT_FAILURE); } err = guestfs_last_errno (g); if (err != ENOENT) { fprintf (stderr, "guestfs_lstat: expected errno == ENOENT, but got %d\n", err); exit (EXIT_FAILURE); } if (guestfs_touch (g, "/test") == -1) exit (EXIT_FAILURE); r = guestfs_mkdir (g, "/test"); if (r != -1) { fprintf (stderr, "guestfs_mkdir: expected error for file which exists\n"); exit (EXIT_FAILURE); } err = guestfs_last_errno (g); if (err != EEXIST) { fprintf (stderr, "guestfs_mkdir: expected errno == EEXIST, but got %d\n", err); exit (EXIT_FAILURE); } guestfs_close (g); exit (EXIT_SUCCESS); }