/* * 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(""); } }