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