#!/usr/bin/awk -f
# edit the line above to point to your real location of awk interpreter

# awk program for adding new entries in smbpasswd files
# arguments are account names to add; feed it an existent Samba password
# file on stdin, results will be written on stdout
#
# Michal Jaegermann, michal@ellpspace.math.ualberta.ca, 1995-11-09

BEGIN {
  me = "addtosmbpass";
  count = ARGC;
  FS = ":";
 
  if (count == 1) {
    print "Usage:", me,
          "name1 [name2 ....] < smbpasswd.in >  smbpasswd.out";
    ARGV[1] = "/dev/null";
    ARGC = 2;
    exit;
  }

  for(i = 1; i < count; i++) {
    names[ARGV[i]] = " ";
    delete ARGV[i];
  }
# sane awk should work simply with 'ARGC = 1', but not every awk
# implementation is sane - big sigh!!
  ARGV[1] = "-";
  ARGC = 2;
#
# If you have ypmatch but is not RPC registered (some Linux systems
# for example) comment out the next line.
# "which ypmatch" | getline ypmatch;
  if (1 != match(ypmatch, /^\//)) {
    ypmatch = "";
  }
  pwdf = "/etc/passwd";
}
#check for names already present in input
{
  print $0;
  for(name in names) {
    if($1 == name) {
      delete names[name];
    }
  }
}
END {
  fmt = "%s:%s:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:";
  fmt = fmt   "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:[U          ]:LCT-00000000:%s:\n";
  for(name in names) {
    while ((getline < pwdf) > 0) {
      if ($1 == name) {
	printf(fmt, $1, $3, $5);
	close(pwdf);
	notfound = "";
	break;
      }
      notfound = "n";
    }
    $0 = "";
    if (notfound && ypmatch) {
#     try to find in NIS databases
      command = ypmatch " " name " passwd";
      command | getline;
      if (NF > 0) {
	printf(fmt, $1, $3, $5);
      }
      close(command);
    }
  }
}