Thanks very much!

2013/9/18 Andrew Deason <[email protected]>

> On Tue, 17 Sep 2013 18:32:31 +0800
> shuaijie wang <[email protected]> wrote:
>
> > Is there any method to check if a dir resides in AFS volume? Since AFS
> > can be mounted in any local logical path, simply checking prefix
> > "/afs" seems not sufficient for all the cases. So is there any system
> > call like "is_inafs()" to accomplish this?
>
> The most portable and "correct" way is to issue a pioctl. Stuff based on
> mountpoint information or statfs/statvfs info I think can vary depending
> on the system, so may not be portable. If you don't care about that, you
> can just look at the fs info from statfs/statvfs.
>
> If this is for a script, just call an afs command like 'fs examine' or
> 'fs lq' or whatever. For a C program, you can call a variant on pioctl()
> itself. From libkopenafs, you have k_pioctl. An example of usage:
>
> $ cat foo.c
> #include <stdio.h>
> #include <stdint.h>
> #include <string.h>
> #include <errno.h>
>
> #include <sys/ioctl.h>
> #include <kopenafs.h>
>
> int
> main(int argc, char *argv[])
> {
>     struct ViceIoctl iob;
>     uint32_t fid[4];
>     int code;
>
>     if (argc < 2) {
>         return 1;
>     }
>
>     memset(&iob, 0, sizeof(iob));
>     iob.out = (void*)&fid;
>     iob.out_size = sizeof(fid);
>
>     code = k_pioctl(argv[1], VIOCGETFID, &iob, 1);
>     if (code) {
>         printf("File %s is NOT in afs (or there was an error)\n", argv[1]);
>         return 1;
>     }
>     printf("File %s is in afs\n", argv[1]);
>     return 0;
> }
> $ gcc foo.c -lkopenafs
> $ ./a.out /etc/passwd
> File /etc/passwd is NOT in afs (or there was an error)
> $ ./a.out /afs/.localcell
> File /afs/.localcell is in afs
> $ ln -s /afs/.localcell /tmp/fooafs
> $ ./a.out /tmp/fooafs
> File /tmp/fooafs is in afs
>
> The last argument to k_pioctl is a flag for whether or not to follow
> symlinks (setting it to 0 would change the result of that last example).
> If a file is actually in afs, k_pioctl can obviously still fail if we
> can't resolve the whole path. The return code should be -1 for 'not in
> afs', 0 for 'in afs', and something else for an error. Sometimes other
> errors appear as -1, though, so I wouldn't interpret a -1 as an
> authoritative answer.
>
> That k_pioctl method also requires effectively stat()ing the file. If
> you run it on a mountpoint, we will try to access the target directory.
> You can avoid that (and possibly run more quickly) by using some
> different pioctl calls, but if you don't care, just go with the above
> simple example.
>
> --
> Andrew Deason
> [email protected]
>
> _______________________________________________
> OpenAFS-info mailing list
> [email protected]
> https://lists.openafs.org/mailman/listinfo/openafs-info
>

Reply via email to