/*
 * @(#) $Header: /tmp/cvs/mysql-admutils/common.c,v 1.2 2002-02-27 08:49:48 knutpett Exp $
 *
 * functions used by mysql-dbadm.c and mysql-useradm.c
 *
 */

#include <config.h>
#include <stdio.h>
#include <stdarg.h>
#include <mysql.h>
#include <assert.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <grp.h>
#include "mysql-admutils.h"

char *program_name;

static char *rcsheader = "@(#) " PACKAGE " " VERSION " ljosa@initio.no $Header: /tmp/cvs/mysql-admutils/common.c,v 1.2 2002-02-27 08:49:48 knutpett Exp $";


int
version()
{
  printf("%s %s\n", program_name, rcsheader);
  exit(0);
}


int
wrong_use(char *format, ...)
{
  va_list ap;

  if (format)
    {
      fprintf(stderr, "%s: ", program_name);
      va_start(ap, format);
      vfprintf(stderr, format, ap);
      va_end(ap);
      putchar('\n');
    }

  fprintf(stderr, "Try `%s --help' for more information.\n", program_name);

  return 1;
}


/* always returns 1. */
int
dberror(MYSQL *pmysql, char *format, ...)
{
  char *errmsg;
  va_list ap;

  fprintf(stderr, "%s: ", program_name);
  va_start(ap, format);
  vfprintf(stderr, format, ap);
  va_end(ap);
  fprintf(stderr, "\n");

  if (pmysql)
    {
      errmsg = mysql_error(pmysql);
      if ((errmsg) && (strcmp(errmsg, "") != 0))
	fprintf(stderr, "mysql: %s\n", errmsg);
  
      mysql_close(pmysql);
    }

  return 1;
}


/* always returns 1. */
int
fatal_error(char *format, ...)
{
  va_list ap;

  fprintf(stderr, "%s: ", program_name);
  va_start(ap, format);
  vfprintf(stderr, format, ap);
  va_end(ap);
  fprintf(stderr, "\n");

  return 1;
}


/* decides if the UNIX user is entitled to the MySQL database or MySQL user. */
int
owner(char *name)
{
  struct passwd *p;
  
  p = getpwuid(getuid());
  if (!p)
    {
      dberror(NULL, "Failed to look up your UNIX username.");
      exit(1);
    }

  if (strcmp(name, p->pw_name) == 0)
    return 1; /* OK */

  if ((strncmp(name, p->pw_name, strlen(p->pw_name)) == 0) &&
      (*(name + strlen(p->pw_name)) == '_'))
    return 1; /* OK */

  return 0; /* not owner if we get as far as this */
}

/**
 * Decides if the user is member of a group. The Unix group can't contain any
 * '_'. i.e 'fidi_s' won't be accepted.
 */
int 
member(char *gr) {
  char *username;

  char *group;
  struct group *g;

  struct passwd *p;
  char *foo;

  /*  size_t i = 0; */
  
  /* Get username */
  p = getpwuid(getuid());
  if (!p) {
    fprintf(stderr, "Failed to look up your UNIX username.");
    exit(1);
  }
  username = p->pw_name;
 
  /* Copy string, but cut at '_' */
  group = strdup(gr);
  if (group == NULL) {
    fprintf(stderr, "Couldn't allocate memory. Terminating."); 
    exit(1);
  }

  foo = strchr(group, '_');
  if (foo) {
#if DEBUG
    printf("gr = %s, group = %s, foo = %s\n", gr, group, foo);
#endif
    *foo = '\0'; 
  }
  
  /* Get group */
  g = getgrnam(group);
  if (g == NULL) {
    fprintf(stderr, "No such group: %s\n", group);
    exit(1);
  }

  /* Check if user is member of group */
  while(*g->gr_mem != NULL) {
    char * member = *g->gr_mem; 
#if DEBUG
    printf("Medlem: %s\n", *g->gr_mem);
#endif

    if (strcmp(member,username) == 0) {
#if DEBUG      
      printf("You have access to '%s'\n", gr);
#endif
      return 1;              /* OK */
    } else
      *g->gr_mem++;
  } 
#if DEBUG
  printf("You have no access to '%s'\n", gr);
#endif

  return 0;

}


int
reload(MYSQL *pmysql)
{
  return mysql_reload(pmysql);
}