/*
 * Program used to convert password database from digital unix to
 * shadow format.
 *
 * wildcat <wildcat@espix.org>
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int convert (char **);

int main (int argc, char **argv)
{
  FILE *fsrc, *fdst;
  char *line = NULL;
  size_t len = 0;
  
  if (argc < 3) { printf("Syntax error, use %s <file src> <file dst>\n", argv[0]); exit(0); }
  
  if (!(fsrc = fopen(argv[1], "r"))) { printf("Cannot open %s.\n", argv[1]); }
  if (!(fdst = fopen(argv[2], "w"))) { printf("Cannor create %s.\n", argv[2]); }
  
  while (getline (&line, &len, fsrc) > 0)
  {
    if (*line == ':' || *(line+1) == ':') { free (line); len=0; continue; }
    if (convert(&line) > 0)
      fprintf(fdst, "%s\n", line);
    free(line);
    len = 0;
  }
  fclose(fsrc); fclose(fdst); 
  return 1;
}

int convert (char **line)
{
  char *tmp;
  char *login;
  char *pass;
  size_t len;
  if (( tmp = strstr(*line, "u_name")))
  {
    tmp += (strlen("u_name")) + 1;
    len = ((strchr(tmp, ':')) - tmp );
    login = (char *) malloc (len + 1 );
    strncpy(login, tmp, len);
    *(login + len) = '\0';
   
    if ((tmp = strstr(*line, "u_pwd")))
    {
      tmp += (strlen("u_pwd")) + 1;
      len  = ((strchr(tmp, ':')) - tmp );
      pass = (char *) malloc (len + 1 );
      strncpy(pass, tmp, len);
      *(pass + len) = '\0';
      free (*line);
      *line = (char *) malloc(strlen(login) + strlen(pass) + 2 );
      sprintf(*line, "%s:%s", login, pass);
      free(login);
      free(pass);
      return 1;
    }
    free(login);
  }
  return -1;
}
