RCS_ID_C "$Id: user.c,v 1.1 93/09/17 06:25:47 ppessi Exp $";
/*
 * user.c
 *
 * Get group and user names for their ids
 *
 * Author: ppessi <Pekka.Pessi@hut.fi>
 *
 * Copyright (c) 1993 Pekka Pessi
 *
 * Created      : Wed May 26 09:21:59 1993 ppessi
 * Last modified: Fri Sep 17 06:02:10 1993 ppessi
 *
 */

#include <exec/lists.h>
#include <exec/nodes.h>
#include <dos/var.h>

#if __SASC
#include <proto/exec.h>
#include <proto/dos.h>
#else
#error Unsupported Compiler.
#endif

#include <pwd.h>
#include <grp.h>

#include <stdlib.h>
#include <string.h>

static void wtoa(UWORD w, char a[9]);

/*
 * user
 *      Return user login for given uid. 
 *      Return also group ID if specified.
 *      Names have space filled up to 8 chars.
 *      Use a cache of 1 user
 */
UBYTE *
user(UWORD uid)
{
  static UBYTE retval[9];		/* buffer to trash */
  static struct passwd *user = NULL;

  /* Same as last one? */
  if (user && user->pw_uid == uid) {
    return retval;
  }

  if (user = getpwuid(uid)) {
    int i;
    for (i = 0; i < 8 && (retval[i] = user->pw_name[i]); i++)
      ;
    for (; i < 8; retval[i++] = ' ')
      ;
    retval[8] = '\0';
  } else {
    wtoa(uid, retval);
  }

  return retval;
}

UBYTE * 
group(UWORD gid)
{
  static UBYTE retval[9];		
  static struct group *group = NULL;

  /* Same as last one? */
  if (group && group->gr_gid == gid) {
    return retval;
  }

  if (group = getgrgid(gid)) {
    int i;
    for (i = 0; i < 8 && (retval[i] = group->gr_name[i]); i++)
      ;
    for (; i < 8; retval[i++] = ' ')
      ;
    retval[8] = '\0';
  } else {
    wtoa(gid, retval);
  }

  return retval;
}

/* 
 * wtoa
 */
static void
wtoa(UWORD w, char a[9])
{
  short i;
  char b[8];

  for (i = 0; i < 8; i++) 
    a[i] = ' ';
  a[8] = '\0';

  if (w == 0) {
    a[0] = '0';
  } else {
    b[5] = '\0';
    b[4] = w % 10 + '0'; w /= 10;
    b[3] = w % 10 + '0'; w /= 10;
    b[2] = w % 10 + '0'; w /= 10;
    b[1] = w % 10 + '0'; w /= 10;
    b[0] = w + '0';

    for (i = 0; b[i] == '0'; i++)
      ;
    for (; i < 5; i++) 
      *a++ = b[i];
  }
}

