/*	uname() - get system info			Author: Kees J. Bot
 *								7 Nov 1994
 * Returns information about the Minix system.  Alas most
 * of it is gathered at compile time, so machine is wrong, and
 * release and version become wrong if not recompiled.
 * More chip types and Minix versions need to be added.
 */
#define uname	_uname
#define open	_open
#define read	_read
#define close	_close
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <minix/config.h>
#include <minix/com.h>
#include <minix/minlib.h>

int uname(name) struct utsname *name;
{
  int hf, n, err;
  struct kinfo kinfo;
  char *nl;

  /* Read the node name from /etc/hostname.file. */
  if ((hf = open("/etc/hostname.file", O_RDONLY)) < 0) {
	if (errno != ENOENT) return(-1);
	strcpy(name->nodename, "noname");
  } else {
	n = read(hf, name->nodename, sizeof(name->nodename) - 1);
	err = errno;
	close(hf);
	errno = err;
	if (n < 0) return(-1);
	name->nodename[n] = 0;
	if ((nl = strchr(name->nodename, '\n')) != NULL) {
		memset(nl, 0, (name->nodename + sizeof(name->nodename)) - nl);
	}
  }
 
  getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);

  strcpy(name->sysname, "Minix");
  strcpy(name->release, kinfo.release);
  strcpy(name->version, kinfo.version);
#if (CHIP == INTEL)
  name->machine[0] = 'i';
  strcpy(name->machine + 1, itoa(getprocessor()));
#if _WORD_SIZE == 4
  strcpy(name->arch, "i386");
#else
  strcpy(name->arch, "i86");
#endif
#endif
  return(0);
}
