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