/*
* call-seq:
* File.get_all_attrs(filename) -> hash
*
* Returns a hash with all attributes and their values
*
* File.get_all_attrs(".") => ("mime" => "text/plain", "rating" => "4")
*
*/
static VALUE rb_file_get_all_attrs(obj, fname)
VALUE obj, fname;
{
int size;
char *lval;
char *gval;
int *gsize;
int lret, gret;
int beg, end;
VALUE retval;
Check_Type(fname, T_STRING);
size = 16000;
lval = malloc(size);
gsize = malloc(sizeof(int));
gval = malloc(size);
lret = llistxattr(StringValueCStr(fname), lval, size);
if(lret >= 0) {
retval = rb_hash_new();
beg = 0;
for(end=0; end < lret; end++) {
if (beg == 0 && lval[end] == '.') {
beg = end + 1;
}
if (lval[end] == 0) {
*gsize = size;
gret = attr_get(StringValueCStr(fname),
lval+beg, gval, gsize, 1);
if(gret == 0) {
rb_hash_aset(retval,
rb_str_new(lval+beg,
end-beg),
rb_str_new(gval, *gsize));
} else {
if(errno != ENODATA && errno != ENOATTR) {
free(lval);
free(gval);
free(gsize);
rb_sys_fail(StringValueCStr(fname));
}
}
beg = 0;
}
}
free(lval);
free(gval);
free(gsize);
return retval;
} else {
free(lval);
free(gval);
free(gsize);
rb_sys_fail(StringValueCStr(fname));
}
}