static int do_set_xattr_bsd(struct asfd *asfd, const char *path, const char *xattrtext, size_t xlen, struct cntr *cntr) { int ret=-1; size_t l=0; char *data=NULL; char *value=NULL; char *nspace=NULL; data=(char *)xattrtext; l=xlen; while(l>0) { ssize_t cnt; ssize_t vlen=0; int cnspace=0; char *name=NULL; if(!(nspace=get_next_xattr_str(asfd, &data, &l, cntr, &vlen, path)) || !(value=get_next_xattr_str(asfd, &data, &l, cntr, &vlen, path))) goto end; // Need to split the name into two parts. if(!(name=strchr(nspace, '.'))) { logw(asfd, cntr, "could not split %s into namespace and name on %s\n", nspace, path); goto end; } *name='\0'; name++; if(extattr_string_to_namespace(nspace, &cnspace)) { logw(asfd, cntr, "could not convert %s into namespace on %s\n", nspace, path); goto end; } //printf("set_link: %d %s %s %s\n", cnspace, nspace, name, value); if((cnt=extattr_set_link(path, cnspace, name, value, vlen))!=vlen) { logw(asfd, cntr, "extattr_set_link error on %s %zd!=%zd: %s\n", path, cnt, vlen, strerror(errno)); goto end; } free_w(&nspace); free_w(&value); } ret=0; end: free_w(&nspace); free_w(&value); return ret; }
int main(int argc, char *argv[]) { char *buf, *visbuf, *p; const char *options, *attrname; size_t len; ssize_t ret; int buflen, visbuflen, ch, error, i, arg_counter, attrnamespace, minargc; int flag_force = 0; int flag_nofollow = 0; int flag_null = 0; int flag_quiet = 0; int flag_string = 0; int flag_hex = 0; visbuflen = buflen = 0; visbuf = buf = NULL; p = basename(argv[0]); if (p == NULL) p = argv[0]; if (!strcmp(p, "getextattr")) { what = EAGET; options = "fhqsx"; minargc = 3; } else if (!strcmp(p, "setextattr")) { what = EASET; options = "fhnq"; minargc = 4; } else if (!strcmp(p, "rmextattr")) { what = EARM; options = "fhq"; minargc = 3; } else if (!strcmp(p, "lsextattr")) { what = EALS; options = "fhq"; minargc = 2; } else { usage(); } while ((ch = getopt(argc, argv, options)) != -1) { switch (ch) { case 'f': flag_force = 1; break; case 'h': flag_nofollow = 1; break; case 'n': flag_null = 1; break; case 'q': flag_quiet = 1; break; case 's': flag_string = 1; break; case 'x': flag_hex = 1; break; case '?': default: usage(); } } argc -= optind; argv += optind; if (argc < minargc) usage(); error = extattr_string_to_namespace(argv[0], &attrnamespace); if (error) err(-1, "%s", argv[0]); argc--; argv++; if (what != EALS) { attrname = argv[0]; argc--; argv++; } else attrname = NULL; if (what == EASET) { mkbuf(&buf, &buflen, strlen(argv[0]) + 1); strcpy(buf, argv[0]); argc--; argv++; } for (arg_counter = 0; arg_counter < argc; arg_counter++) { switch (what) { case EARM: if (flag_nofollow) error = extattr_delete_link(argv[arg_counter], attrnamespace, attrname); else error = extattr_delete_file(argv[arg_counter], attrnamespace, attrname); if (error >= 0) continue; break; case EASET: len = strlen(buf) + flag_null; if (flag_nofollow) ret = extattr_set_link(argv[arg_counter], attrnamespace, attrname, buf, len); else ret = extattr_set_file(argv[arg_counter], attrnamespace, attrname, buf, len); if (ret >= 0) { if ((size_t)ret != len && !flag_quiet) { warnx("Set %zd bytes of %zu for %s", ret, len, attrname); } continue; } break; case EALS: if (flag_nofollow) ret = extattr_list_link(argv[arg_counter], attrnamespace, NULL, 0); else ret = extattr_list_file(argv[arg_counter], attrnamespace, NULL, 0); if (ret < 0) break; mkbuf(&buf, &buflen, ret); if (flag_nofollow) ret = extattr_list_link(argv[arg_counter], attrnamespace, buf, buflen); else ret = extattr_list_file(argv[arg_counter], attrnamespace, buf, buflen); if (ret < 0) break; if (!flag_quiet) printf("%s\t", argv[arg_counter]); for (i = 0; i < ret; i += ch + 1) { /* The attribute name length is unsigned. */ ch = (unsigned char)buf[i]; printf("%s%*.*s", i ? "\t" : "", ch, ch, buf + i + 1); } if (!flag_quiet || ret > 0) printf("\n"); continue; case EAGET: if (flag_nofollow) ret = extattr_get_link(argv[arg_counter], attrnamespace, attrname, NULL, 0); else ret = extattr_get_file(argv[arg_counter], attrnamespace, attrname, NULL, 0); if (ret < 0) break; mkbuf(&buf, &buflen, ret); if (flag_nofollow) ret = extattr_get_link(argv[arg_counter], attrnamespace, attrname, buf, buflen); else ret = extattr_get_file(argv[arg_counter], attrnamespace, attrname, buf, buflen); if (ret < 0) break; if (!flag_quiet) printf("%s\t", argv[arg_counter]); if (flag_string) { mkbuf(&visbuf, &visbuflen, ret * 4 + 1); strvisx(visbuf, buf, ret, VIS_SAFE | VIS_WHITE); printf("\"%s\"\n", visbuf); continue; } else if (flag_hex) { for (i = 0; i < ret; i++) printf("%s%02x", i ? " " : "", buf[i]); printf("\n"); continue; } else { fwrite(buf, ret, 1, stdout); printf("\n"); continue; } default: break; } if (!flag_quiet) warn("%s: failed", argv[arg_counter]); if (flag_force) continue; return(1); } return (0); }
int main(int argc, char *argv[]) { int error = 0, attrnamespace; if (argc < 2) usage(); if (!strcmp(argv[1], "start")) { if (argc != 3) usage(); error = extattrctl(argv[2], UFS_EXTATTR_CMD_START, NULL, 0, NULL); if (error) { perror("extattrctl start"); return (-1); } } else if (!strcmp(argv[1], "stop")) { if (argc != 3) usage(); error = extattrctl(argv[2], UFS_EXTATTR_CMD_STOP, NULL, 0, NULL); if (error) { perror("extattrctl stop"); return (-1); } } else if (!strcmp(argv[1], "enable")) { if (argc != 6) usage(); error = extattr_string_to_namespace(argv[3], &attrnamespace); if (error) { perror("extattrctl enable"); return (-1); } error = extattrctl(argv[2], UFS_EXTATTR_CMD_ENABLE, argv[5], attrnamespace, argv[4]); if (error) { perror("extattrctl enable"); return (-1); } } else if (!strcmp(argv[1], "disable")) { if (argc != 5) usage(); error = extattr_string_to_namespace(argv[3], &attrnamespace); if (error) { perror("extattrctl disable"); return (-1); } error = extattrctl(argv[2], UFS_EXTATTR_CMD_DISABLE, NULL, attrnamespace, argv[4]); if (error) { perror("extattrctl disable"); return (-1); } } else if (!strcmp(argv[1], "initattr")) { argc -= 2; argv += 2; error = initattr(argc, argv); if (error) return (-1); } else if (!strcmp(argv[1], "showattr")) { argc -= 2; argv += 2; error = showattr(argc, argv); if (error) return (-1); } else usage(); return (0); }