#!/usr/local/bin/perl
# filesystems.cgi
# List all filesystems and their types

require './file-lib.pl';
print "Content-type: text/plain\n\n";
if (!&foreign_check("mount")) {
	print "0\n";
	exit;
	}
&foreign_require("mount", "mount-lib.pl");
@mounts = &foreign_call("mount", "list_mounted");
print "1\n";

foreach $m (sort { length($a->[0]) <=> length($b->[0]) } @mounts) {
	next if ($m->[0] !~ /^\//);
	local @supp = @{$support{$m->[2]}};
	if (!@supp) {
		# Work out what this filesystem supports
		@supp = ( eval $config{$m->[2]."_acl"} ? 1 : 0,
			  eval $config{$m->[2]."_attr"} ? 1 : 0,
			  eval $config{$m->[2]."_ext"} ? 1 : 0 );
		$support{$m->[2]} = \@supp;
		}

	# Check if the filesystem really does support attrs and ACLs
	local @supp2 = @supp;
	if ($supp2[0]) {
		local $out = `$config{'getfacl'} '$m->[0]' 2>/dev/null`;
		if ($?) {
			$supp2[0] = 0;
			}
		else {
			local $aclcount;
			foreach $l (split(/\n/, $out)) {
				$l =~ s/#.*$//;
				$l =~ s/\s+$//;
				$aclcount++ if ($l =~ /\S/);
				}
			$supp2[0] = 0 if (!$aclcount);
			}
		}
	if ($supp2[1]) {
		local $out = `attr -l '$m->[0]' 2>/dev/null`;
		if ($?) {
			$supp2[1] = 0;
			}
		}

	print join(" ", @$m[0..3], @supp2),"\n";
	}

