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