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