1 #
   2 # Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
   3 #
   4 
   5 #
   6 # Exacct.pm contains wrappers for the exacct error functions and syscalls,
   7 # and some 'shorthand' convenience functions.
   8 # 
   9 
  10 require 5.0010;
  11 use strict;
  12 use warnings;
  13 
  14 package Sun::Solaris::Exacct;
  15 
  16 our $VERSION = '1.5';
  17 use XSLoader;
  18 XSLoader::load(__PACKAGE__, $VERSION);
  19 
  20 # @_Constants is set up by the XSUB bootstrap() function.
  21 our (@EXPORT_OK, %EXPORT_TAGS, @_Constants);
  22 my @syscalls = qw(getacct putacct wracct);
  23 my @libcalls = qw(ea_error ea_error_str);
  24 my @shorthand = qw(ea_register_catalog ea_new_catalog ea_new_file ea_new_item
  25     ea_new_group ea_dump_object);
  26 @EXPORT_OK = (@_Constants, @syscalls, @libcalls, @shorthand);
  27 %EXPORT_TAGS = (CONSTANTS => \@_Constants, SYSCALLS => \@syscalls,
  28     LIBCALLS => \@libcalls, SHORTHAND => \@shorthand, ALL => \@EXPORT_OK);
  29 
  30 use base qw(Exporter);
  31 
  32 #
  33 # Extend the default Exporter::import to do optional inclusion of all the
  34 # lower-level Exacct modules.  Any export tag prefixed with 'EXACCT_' is
  35 # interpreted as a request to import that tag from all the Exacct modules.
  36 #
  37 sub import
  38 {
  39         my (@my_tags, %sub_tags);
  40         shift(@_);
  41         foreach my $tag (@_) {
  42                 # Note: Modifies @_
  43                 if ($tag =~ /^:EXACCT_(.*)$/) {
  44                         my $new_tag = ":$1";
  45                         push(@my_tags, $new_tag);
  46                         $sub_tags{$new_tag} = 1;
  47                 } else {
  48                         push(@my_tags, $tag);
  49                 }
  50         }
  51 
  52         # Export the taglist with all "EXACCT_" prefixes removed.
  53         __PACKAGE__->export_to_level(1, undef, @my_tags);
  54 
  55         # Do sub-module imports if required.
  56         if (@my_tags = grep(exists($sub_tags{$_}), qw(:ALL :CONSTANTS))) {
  57 
  58                 # ::Catalog
  59                 require Sun::Solaris::Exacct::Catalog;
  60                 Sun::Solaris::Exacct::Catalog->export_to_level(1, undef,
  61                     @my_tags);
  62 
  63                 # ::File and Fcntl
  64                 require Sun::Solaris::Exacct::File;
  65                 Sun::Solaris::Exacct::File->export_to_level(1, undef,
  66                     @my_tags);
  67                 require Fcntl;
  68                 Fcntl->export_to_level(1, undef, ':DEFAULT');
  69 
  70                 # ::Object
  71                 require Sun::Solaris::Exacct::Object;
  72                 Sun::Solaris::Exacct::Object->export_to_level(1, undef,
  73                     @my_tags);
  74         }
  75 }
  76 
  77 #
  78 # Convenience functions - shorthand for fully qualified method names.  Note that
  79 # goto() is used to call the methods so that any errors will appear to come
  80 # from the correct place.  Because goto() does not understand method call syntax
  81 # it is necessary to fake up the class a parameter by unshifting the appropriate
  82 # class name onto the argument lists.
  83 #
  84 
  85 sub ea_register_catalog
  86 {
  87         unshift(@_, 'Sun::Solaris::Exacct::Catalog');
  88         goto(&Sun::Solaris::Exacct::Catalog::register);
  89 }
  90 
  91 sub ea_new_catalog
  92 {
  93         unshift(@_, 'Sun::Solaris::Exacct::Catalog');
  94         goto(&Sun::Solaris::Exacct::Catalog::new);
  95 }
  96 
  97 sub ea_new_file
  98 {
  99         unshift(@_, 'Sun::Solaris::Exacct::File');
 100         goto(&Sun::Solaris::Exacct::File::new);
 101 }
 102 
 103 sub ea_new_item
 104 {
 105         unshift(@_, 'Sun::Solaris::Exacct::Item');
 106         goto(&Sun::Solaris::Exacct::Object::Item::new);
 107 }
 108 
 109 sub ea_new_group
 110 {
 111         unshift(@_, 'Sun::Solaris::Exacct::Group');
 112         goto(&Sun::Solaris::Exacct::Object::Group::new);
 113 }
 114 
 115 sub ea_dump_object
 116 {
 117         unshift(@_, 'Sun::Solaris::Exacct::Object');
 118         goto(&Sun::Solaris::Exacct::Object::dump);
 119 }
 120 
 121 1;