Index: trunk/Nebulous/lib/Nebulous/Util.pm
===================================================================
--- trunk/Nebulous/lib/Nebulous/Util.pm	(revision 17765)
+++ trunk/Nebulous/lib/Nebulous/Util.pm	(revision 17845)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004  Joshua Hoblitt
 #
-# $Id: Util.pm,v 1.11 2008-03-20 23:21:58 jhoblitt Exp $
+# $Id: Util.pm,v 1.12 2008-05-29 03:59:30 jhoblitt Exp $
 
 package Nebulous::Util;
@@ -8,5 +8,5 @@
 use warnings FATAL => qw( all );
 
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 use base qw( Exporter );
@@ -24,4 +24,9 @@
     _open_uri
     parse_neb_key
+    print_xattrs
+    print_all_xattrs
+    write_xattrs
+    delete_xattrs
+    parse_xattr_pair
 );
 
@@ -39,4 +44,5 @@
 );
 
+
 sub _nuke_file {
     my $path = shift;
@@ -51,4 +57,5 @@
 }
 
+
 sub _get_file_path {
     my $uri = shift;
@@ -58,4 +65,5 @@
     return $path;
 }
+
 
 sub _get_filehandle {
@@ -70,4 +78,5 @@
 }
 
+
 sub _open_uri {
     my ( $uri , $flags ) = @_;
@@ -81,4 +90,96 @@
 
 
+sub print_all_xattrs
+{
+    my ($neb, $key) = @_;
+
+    return unless defined $neb;
+    return unless defined $key;
+
+    my $xattr_names = $neb->listxattr($key) or die $neb->err;
+    foreach my $name (@$xattr_names) {
+        print_xattrs($neb, $key, $name) or return;
+    }
+
+    return 1;
+}
+
+
+sub print_xattrs
+{
+    my ($neb, $key, @xattr_names) = @_;
+
+    return unless defined $neb;
+    return unless defined $key;
+    return unless scalar @xattr_names;
+
+    foreach my $arg (@xattr_names) {
+        my ($name, $value) = parse_xattr_pair($arg);
+        die "can not process $arg because it is in name:value form"
+            if defined $value;
+        $value = $neb->getxattr($key, $name) or die $neb->err;
+        print "$name:$value\n";
+    }
+
+    return 1;
+}
+
+
+sub write_xattrs
+{
+    my ($neb, $key, @xattr_pairs) = @_;
+
+    return unless defined $neb;
+    return unless defined $key;
+    return unless scalar @xattr_pairs;
+
+    foreach my $arg (@xattr_pairs) {
+        my ($name, $value) = parse_xattr_pair($arg);
+        die "can not process $arg because it is not in name:value form"
+            unless defined $name and defined $value;
+        die "xattr name: $name is not in to the form user.name"
+            unless $name =~ /^user\./;
+        $neb->setxattr($key, $name, $value, "replace")
+            or die $neb->err;
+    }
+
+    return 1;
+}
+
+
+sub delete_xattrs
+{
+    my ($neb, $key, @xattr_names) = @_;
+
+    return unless defined $neb;
+    return unless defined $key;
+    return unless scalar @xattr_names;
+
+    foreach my $arg (@xattr_names) {
+        my ($name, $value) = parse_xattr_pair($arg);
+        die "can not process $arg because it is in name:value form"
+            if defined $value;
+        $neb->removexattr($key, $name)
+            or die $neb->err;
+    }
+
+    return 1;
+}
+
+
+sub parse_xattr_pair
+{
+    my $pair = shift;
+    
+    return unless defined $pair;
+
+    no warnings qw( uninitialized );
+    my ($name, $value) = split(/:/, $pair);
+    use warnings;
+
+    return ($name, $value);
+}
+
+
 1;
 
