/*
* call-seq:
* file.get_all_attrs() -> hash
*
* Returns a hash with all attributes and their values
*
* File.new(__FILE__).get_all_attrs() => ("type" => "jpeg", "rat" => "4")
*
*/
VALUE rb_file_get_all_attrsf(fobj)
VALUE fobj;
{
int size;
char *lval;
char *gval;
int *gsize;
int lret, gret;
int beg, end;
VALUE retval;
OpenFile *fptr;
FILE *f;
GetOpenFile(fobj, fptr);
f = GetReadFile(fptr);
Check_Type(fobj, T_FILE);
size = 16000;
lval = malloc(size);
gsize = malloc(sizeof(int));
gval = malloc(size);
lret = flistxattr(fileno(f), 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_getf(fileno(f),
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("");
}
}
beg = 0;
}
}
free(lval);
free(gval);
free(gsize);
return retval;
} else {
free(lval);
free(gval);
free(gsize);
rb_sys_fail("");
}
}