+
+int llapi_getfacl(char *fname, char *cmd)
+{
+ struct rmtacl_ioctl_data data;
+ char out[RMTACL_SIZE_MAX] = "";
+ int fd, rc;
+
+ data.cmd = cmd;
+ data.cmd_len = strlen(cmd) + 1;
+ data.res = out;
+ data.res_len = sizeof(out);
+
+ fd = open(fname, 0);
+ if (fd == -1) {
+ err_msg("open %s failed", fname);
+ return -1;
+ }
+
+ rc = ioctl(fd, LL_IOC_GETFACL, &data);
+ close(fd);
+ if (errno == EBADE) {
+ fprintf(stderr, "Please use getfacl directly!\n");
+ rc = 1;
+ } else if (rc) {
+ err_msg("getfacl %s failed", fname);
+ } else {
+ printf("%s", out);
+ }
+
+ return rc;
+}
+
+int llapi_setfacl(char *fname, char *cmd)
+{
+ struct rmtacl_ioctl_data data;
+ char out[RMTACL_SIZE_MAX] = "";
+ int fd, rc;
+
+ data.cmd = cmd;
+ data.cmd_len = strlen(cmd) + 1;
+ data.res = out;
+ data.res_len = sizeof(out);
+
+ fd = open(fname, 0);
+ if (fd == -1) {
+ err_msg("open %s failed", fname);
+ return -1;
+ }
+
+ rc = ioctl(fd, LL_IOC_SETFACL, &data);
+ close(fd);
+ if (errno == EBADE) {
+ fprintf(stderr, "Please use setfacl directly!\n");
+ rc = 1;
+ } else if (errno == EOPNOTSUPP) {
+ fprintf(stderr, "setfacl: %s: %s\n", fname, strerror(errno));
+ rc = 1;
+ } else if (rc) {
+ err_msg("setfacl %s failed", fname);
+ } else {
+ printf("%s", out);
+ }
+
+ return rc;
+}