Files
glusterfs/api/examples/glfsxmp.c
Anand Avati a1db18cf7a gfapi: support for chdir() and family
Add support for chdir, fchdir, getcwd, realpath equivalents in
GFAPI. These are required for the Samba VFS plugin.

Change-Id: I91d2db9146994403c98961c489c7640c51d5add2
BUG: 953694
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/4853
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
2013-04-19 04:41:35 -07:00

248 lines
5.4 KiB
C

#include <stdio.h>
#include <errno.h>
#include "api/glfs.h"
#include <string.h>
#include <time.h>
int
test_dirops (glfs_t *fs)
{
glfs_fd_t *fd = NULL;
char buf[512];
struct dirent *entry = NULL;
fd = glfs_opendir (fs, "/");
if (!fd) {
fprintf (stderr, "/: %s\n", strerror (errno));
return -1;
}
fprintf (stderr, "Entries:\n");
while (glfs_readdir_r (fd, (struct dirent *)buf, &entry), entry) {
fprintf (stderr, "%s: %lu\n", entry->d_name, glfs_telldir (fd));
}
glfs_closedir (fd);
return 0;
}
int
test_xattr (glfs_t *fs)
{
char *filename = "/filename2";
char buf[512];
char *ptr;
int ret;
ret = glfs_setxattr (fs, filename, "user.testkey", "testval", 8, 0);
fprintf (stderr, "setxattr(%s): %d (%s)\n", filename, ret,
strerror (errno));
ret = glfs_setxattr (fs, filename, "user.testkey2", "testval", 8, 0);
fprintf (stderr, "setxattr(%s): %d (%s)\n", filename, ret,
strerror (errno));
ret = glfs_listxattr (fs, filename, buf, 512);
fprintf (stderr, "listxattr(%s): %d (%s)\n", filename, ret,
strerror (errno));
if (ret < 0)
return -1;
for (ptr = buf; ptr < buf + ret; ptr++) {
printf ("key=%s\n", ptr);
ptr += strlen (ptr);
}
return 0;
}
int
test_chdir (glfs_t *fs)
{
int ret = -1;
ino_t ino = 0;
struct stat st;
char *topdir = "/topdir";
char *linkdir = "/linkdir";
char *subdir = "./subdir";
char *respath = NULL;
char pathbuf[4096];
ret = glfs_mkdir (fs, topdir, 0755);
if (ret) {
fprintf (stderr, "mkdir(%s): %s\n", topdir, strerror (errno));
return -1;
}
respath = glfs_getcwd (fs, pathbuf, 4096);
fprintf (stdout, "getcwd() = %s\n", respath);
ret = glfs_symlink (fs, topdir, linkdir);
if (ret) {
fprintf (stderr, "symlink(%s, %s): %s\n", topdir, linkdir, strerror (errno));
return -1;
}
ret = glfs_chdir (fs, linkdir);
if (ret) {
fprintf (stderr, "chdir(%s): %s\n", linkdir, strerror (errno));
return -1;
}
respath = glfs_getcwd (fs, pathbuf, 4096);
fprintf (stdout, "getcwd() = %s\n", respath);
respath = glfs_realpath (fs, subdir, pathbuf);
if (respath) {
fprintf (stderr, "realpath(%s) worked unexpectedly: %s\n", subdir, respath);
return -1;
}
ret = glfs_mkdir (fs, subdir, 0755);
if (ret) {
fprintf (stderr, "mkdir(%s): %s\n", subdir, strerror (errno));
return -1;
}
respath = glfs_realpath (fs, subdir, pathbuf);
if (!respath) {
fprintf (stderr, "realpath(%s): %s\n", subdir, strerror (errno));
} else {
fprintf (stdout, "realpath(%s) = %s\n", subdir, respath);
}
ret = glfs_chdir (fs, subdir);
if (ret) {
fprintf (stderr, "chdir(%s): %s\n", subdir, strerror (errno));
return -1;
}
respath = glfs_getcwd (fs, pathbuf, 4096);
fprintf (stdout, "getcwd() = %s\n", respath);
respath = glfs_realpath (fs, "/linkdir/subdir", pathbuf);
if (!respath) {
fprintf (stderr, "realpath(/linkdir/subdir): %s\n", strerror (errno));
} else {
fprintf (stdout, "realpath(/linkdir/subdir) = %s\n", respath);
}
return 0;
}
int
main (int argc, char *argv[])
{
glfs_t *fs = NULL;
glfs_t *fs2 = NULL;
int ret = 0;
glfs_fd_t *fd = NULL;
glfs_fd_t *fd2 = NULL;
struct stat sb = {0, };
char readbuf[32];
char writebuf[32];
char *filename = "/filename2";
fs = glfs_new ("fsync");
if (!fs) {
fprintf (stderr, "glfs_new: returned NULL\n");
return 1;
}
// ret = glfs_set_volfile (fs, "/tmp/posix.vol");
ret = glfs_set_volfile_server (fs, "tcp", "localhost", 24007);
// ret = glfs_set_volfile_server (fs, "unix", "/tmp/gluster.sock", 0);
ret = glfs_set_logging (fs, "/dev/stderr", 7);
ret = glfs_init (fs);
fprintf (stderr, "glfs_init: returned %d\n", ret);
sleep (2);
fs2 = glfs_new ("fsync");
if (!fs2) {
fprintf (stderr, "glfs_new: returned NULL\n");
return 1;
}
// ret = glfs_set_volfile (fs2, "/tmp/posix.vol");
ret = glfs_set_volfile_server (fs2, "tcp", "localhost", 24007);
ret = glfs_set_logging (fs2, "/dev/stderr", 7);
ret = glfs_init (fs2);
fprintf (stderr, "glfs_init: returned %d\n", ret);
ret = glfs_lstat (fs, filename, &sb);
fprintf (stderr, "%s: (%d) %s\n", filename, ret, strerror (errno));
fd = glfs_creat (fs, filename, O_RDWR, 0644);
fprintf (stderr, "%s: (%p) %s\n", filename, fd, strerror (errno));
fd2 = glfs_open (fs2, filename, O_RDWR);
fprintf (stderr, "%s: (%p) %s\n", filename, fd, strerror (errno));
sprintf (writebuf, "hi there\n");
ret = glfs_write (fd, writebuf, 32, 0);
glfs_lseek (fd2, 0, SEEK_SET);
ret = glfs_read (fd2, readbuf, 32, 0);
printf ("read %d, %s", ret, readbuf);
glfs_close (fd);
glfs_close (fd2);
filename = "/filename3";
ret = glfs_mknod (fs, filename, S_IFIFO, 0);
fprintf (stderr, "%s: (%d) %s\n", filename, ret, strerror (errno));
ret = glfs_lstat (fs, filename, &sb);
fprintf (stderr, "%s: (%d) %s\n", filename, ret, strerror (errno));
ret = glfs_rename (fs, filename, "/filename4");
fprintf (stderr, "rename(%s): (%d) %s\n", filename, ret,
strerror (errno));
ret = glfs_unlink (fs, "/filename4");
fprintf (stderr, "unlink(%s): (%d) %s\n", "/filename4", ret,
strerror (errno));
filename = "/dirname2";
ret = glfs_mkdir (fs, filename, 0);
fprintf (stderr, "%s: (%d) %s\n", filename, ret, strerror (errno));
ret = glfs_lstat (fs, filename, &sb);
fprintf (stderr, "lstat(%s): (%d) %s\n", filename, ret, strerror (errno));
ret = glfs_rmdir (fs, filename);
fprintf (stderr, "rmdir(%s): (%d) %s\n", filename, ret, strerror (errno));
test_dirops (fs);
test_xattr (fs);
test_chdir (fs);
// done
glfs_fini (fs);
glfs_fini (fs2);
return ret;
}