/**********************************************************************
 * main.c -- main routine for lucyd server
 *
 * $Author: brlewis $
 * $Source: /afs/athena.mit.edu/astaff/project/lucydev/src/server/RCS/main.c,v $
 * $Header: /afs/athena.mit.edu/astaff/project/lucydev/src/server/RCS/main.c,v 1.2 92/04/03 11:04:43 brlewis Exp $
 *
 * Copyright 1991 by the Massachusetts Institute of Technology.
 *
 * For copying and distribution information, please see the file
 * <mit-copyright.h>.
 **********************************************************************/
#include <mit-copyright.h>

#ifndef lint
static char rcsid_main_c[] = "$Header: /afs/athena.mit.edu/astaff/project/lucydev/src/server/RCS/main.c,v 1.2 92/04/03 11:04:43 brlewis Exp $";
#endif /* lint */

#include <stdio.h>
#ifdef POSIX
#include <time.h>
#else /* POSIX */
#include <sys/types.h>
#endif /* POSIX */
#include <pwd.h>
#include <syslog.h>
#include <lucy/lucy.h>

extern char *parse_trn();
time_t lucyd_starttime;

/* handle lucyd uptime request */
/*ARGSUSED*/
char *lucyd_uptime(indata)
     char *indata;
{
  return((char *) &lucyd_starttime);
}

/*ARGSUSED*/
main(argc, argv)
     int argc;
     char *argv[];
{
  long code;
  char name[65], *s;
  int i;
  struct passwd *pwent;

  /* if LUCYMAIL env variable is set, use it */
  /* (Have to do this now; can't run luc_init() yet) */
  if (s=getenv("LUCYMAIL")) luv_email=s;

  /* If email is "lucy@ATHENA.MIT.EDU", set name to "lucy" */
  for(i=0; i<64 && luv_email[i] != '@' && luv_email[i] != '\0'; i++)
    name[i]=luv_email[i];
  name[i]='\0';

  /* initialize syslog */
#ifdef ultrix
  openlog("lucyd", LOG_PID);
#else
  openlog("lucyd", LOG_PID, LOG_DAEMON);
#endif

  /* set user, group id */
  if ((pwent=getpwnam(name)) != NULL) {
    if (setgid(pwent->pw_gid))
      syslog(LOG_WARNING, "Warning: gid not set for %s.", name);
    if (setuid(pwent->pw_uid))
      syslog(LOG_WARNING, "Warning: uid not set for %s.", name);
  }

  if (code=luc_init()) {
    syslog(LOG_ERR, "%s (%s), %s exiting...", error_message(code),
	   luv_context, name);
    closelog();
    exit(1);
  }

  lucyd_starttime = time(NULL);

  /* register RPC request handlers */
  if (registerrpc(luv_prog, LUCY_RPC_VERS, LUCY_RPC_PARSE,
		  parse_trn, xdr_int, xdr_long) ||
      registerrpc(luv_prog, LUCY_RPC_VERS, LUCY_RPC_UPTIME,
		  lucyd_uptime, xdr_void, xdr_long))
    {
      syslog(LOG_ERR, "registerrpc failed, %s exiting...", name);
      closelog();
      exit(1);
    }

  svc_run();
  syslog(LOG_ERR, "svc_run() returned, %s exiting...", name);
  closelog();
}
