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