#!/usr/bin/perl
##
## getent(1) clone
## Copyright (c) 2007-2009 SATOH Fumiyasu @ OSS Technology, Inc.
##               <http://www.osstech.co.jp>
##
## License: GNU General Public License version 2 or later
## Date: 2009-02-03, since 2007-07-14
##

use strict;
use warnings;
use IO::File;

my $getent_all = {
  'passwd' => {
    'enum' =>		sub { getpwent; },
    'by_name' =>	sub { getpwnam(shift); },
    'by_id' =>		sub { getpwuid(shift); },
    'filter' =>		sub { $_[1] = 'x'; splice(@_, 4, 2); @_; },
  },
  'group' => {
    'enum' =>		sub { getgrent; },
    'by_name' =>	sub { getgrnam(shift); },
    'by_id' =>		sub { getgrgid(shift); },
    'filter' =>		sub { $_[3] =~ s/ /,/g; @_; },
  },
};

my ($db, $key) = @ARGV;

unless ($db) {
  print "Usage: $0 DATABASE [KEY]\n";
  exit(1);
}

my $getent = $getent_all->{$db};
unless (defined($getent)) {
  STDERR->print("$0: ERROR: Unknown database: $db\n");
  exit(1);
}

my $filter = $getent->{'filter'} || sub { @_ };
my $separator = $getent->{'separator'} || ':';

unless (defined($key)) {
  while (my @ent = $getent->{'enum'}->()) {
    print join($separator, $filter->(@ent)), "\n";
  }
  exit(0);
}

my @ent = ($key =~ /^\d+$/)
  ? $getent->{'by_id'}->($key)
  : $getent->{'by_name'}->($key);
unless (@ent) {
  exit(2);
}

print join($separator, @ent), "\n";
exit(0);

