#!/usr/bin/perl # vi: sw=4 ts=4 use strict; use warnings; use XML::Parser; our $VERSION = 0.01; my $NAMESPACE = 'http://purl.org/NET/webdav/mount'; my $url; my $open; my $parser = new XML::Parser(Handlers => {Start => \&handle_start, End => \&handle_end, Char => \&handle_char}, Namespaces => 1); $parser->parsefile(shift); $open = $open || ''; my $client = shift || 'cadaver'; exec $client, $url . $open; sub handle_start { my ($parser, $name, $attrs) = @_; if ($parser->namespace($name) ne $NAMESPACE) { $parser->xpcarp("invalid davmount syntax"); } if (defined $attrs) { $parser->xpcarp("invalid davmount syntax"); } my @context = $parser->context; my $context = pop @context; if (!defined $context) { if ($name eq 'mount') { return; } $parser->xpcarp("invalid davmount syntax"); } if ($context eq 'mount') { if ($name eq 'url' && !defined $url) { $url = ''; return; } if ($name eq 'open' && !defined $open) { $open = ''; return; } if ($name eq 'user') { return; } $parser->xpcarp("invalid davmount syntax"); } $parser->xpcarp("invalid davmount syntax"); } sub handle_end { my ($parser, $name) = @_; if ($parser->namespace($name) ne $NAMESPACE) { $parser->xpcarp("invalid davmount syntax"); } my @context = $parser->context; my $context = pop @context; if (!defined $context) { if ($name eq 'mount') { $parser->finish; return; } $parser->xpcarp("invalid davmount syntax"); } if ($context eq 'mount') { if ($name eq 'url' && defined $url) { return; } if ($name eq 'open' && defined $open) { return; } if ($name eq 'user') { return; } $parser->xpcarp("invalid davmount syntax"); } $parser->xpcarp("invalid davmount syntax"); } sub handle_char { my ($parser, $string) = @_; my @context = $parser->context; my $context = pop @context; # Whitespace in isn't invalid syntax if ($context eq 'mount' && $string =~ /\s+/) { return; } if ($context eq 'url') { $url .= $string; return; } if ($context eq 'open') { $open .= $string; return; } if ($context eq 'user') { return; } $parser->xpcarp("invalid davmount syntax"); } __END__ =head1 NAME davmount -- parse davmount file & mount described WebDAV resource =head1 SYNOPSIS davmount file [client] =head1 OPTIONS =over 8 =item B davmount file =item B WebDAV client with which to mount described WebDAV resource. Default: 'cadaver' =back =head1 PREREQUISITES XML::Parser =head1 SCRIPT CATEGORIES Web =head1 SEE ALSO L