/*
 * Copyright 1988, 1989, 1990, 1991 Massachusetts Institute of Technology
 */
#include "../../Glib/Glib.h"

main(argc, argv)
     int argc;
     char **argv;
{
  int i, num_mount_points, ret, do_all = 0, base = 1;
#ifdef GMOUNT
  extern void domount(), domultimount();
#endif GMOUNT
#ifdef GUMOUNT
  extern void doumount(), domultiumount();
#endif GUMOUNT
  char *dev_name, *discname, **mount_points, *server_string = NULL,
  **mount_discs;
  extern char *getenv();
  Server *serv;
  int umount_options = 0;

  for (i = 1; i < argc; i++, base++) {
    if (!strcmp(argv[i], "-server")) {
      server_string = argv[++i];
      base++;
    }
    else if (!strcmp(argv[i], "-a")) do_all = 1;
#ifdef GUMOUNT
    else if (!strcmp(argv[i], "-e")) umount_options = EJECT;
#endif /* GUMOUNT */
    else if (!strcmp(argv[i], "-help") || !strcmp(argv[i], "-usage")) {
#ifdef GMOUNT
	printf("usage: gmount [-a] [-server serverspec] [disc-name device-name ...]\n");
	printf("   -a  mounts all discs available, otherwise uses disc-name device-name pairs\n");
#endif /* GMOUNT */
#ifdef GUMOUNT
	printf("usage: gumount [-a] [-e] [-server serverspec] [disc-name] [device-name]\n");
	printf("   -a  unmounts all discs available, otherwise uses disc-name or device-name\n");
	printf("   -e  ejects unmounted discs\n");
#endif /* GUMOUNT */
	printf("   -server allows the specification of a Galatea server\n");
	exit(0);
    }
    else break;
  }

  serv = GNewOpenServer(server_string);
  if (serv == NULL) {
    printf("Could not open Galatea server on %s\n", GOpenedHost());
    exit(1);
  }

#ifdef GMOUNT
  if (argc-base == 0 && !do_all) {
    GGetMounts(serv, &num_mount_points, &mount_points, &mount_discs);
    for (i = 0; i < num_mount_points; i++)
      printf("%s on %s\n",mount_discs[i], mount_points[i]);
    exit(0);
  }
  if (argc-base == 1 && !do_all) {
    domount(serv, argv[base], argv[base]);
    exit (0);
  }
  if (argc-base == 2 && !do_all) {
    domount(serv, argv[base], argv[base+1]);
    exit(0);
  }
  if (do_all) {
    GGetMounts(serv, &num_mount_points, &mount_points, &mount_discs);
    domultimount(serv, num_mount_points, mount_points, mount_points);
    exit(0);
  }
  exit(0);
#endif GMOUNT
#ifdef GUMOUNT
  if (!do_all) {
    for (i = base; i < argc; i++)
      doumount(serv, argv[i], umount_options);
    exit(0);
  }
  if (do_all) {
    GGetMounts(serv, &num_mount_points, &mount_points, &mount_discs);
    domultiumount(serv, num_mount_points, mount_points, umount_options);
    exit(0);
  }
  exit(0);
#endif GUMOUNT
}
#ifdef GMOUNT
void domount(serv, mp1, mp2)
     Server *serv;
     char *mp1, *mp2;
{
  int ret;
  ret = GMount(serv, mp1, mp2, 0);
  if (ret == PERMISSION_DENIED)
    printf("gmount: %s on %s: permission denied\n",mp1,mp2);
  else if (ret == NO_ERROR)
    printf("gmount: %s mounted on %s\n",mp1,mp2);
  else if (ret == BAD_VOLUME)
    printf("gmount: %s: no such mount device\n", mp2);
  else printf("gmount: %s on %s: unknown error [%d]\n",mp1,mp2,ret);
}
void domultimount(serv, num_mps, mp1, mp2)
     Server *serv;
     int num_mps;
     char **mp1, **mp2;
{
  int *ret, i;
  ret = (int *)malloc(num_mps * sizeof(int));
  GMounts(serv, num_mps, mp1, mp2, ret, 0);
  for (i = 0; i < num_mps; i++) {
    if (ret[i] == PERMISSION_DENIED)
      printf("gmount: %s on %s: permission denied\n",mp1[i],mp2[i]);
    else if (ret[i] == NO_ERROR)
      printf("gmount: %s mounted on %s\n",mp1[i],mp2[i]);
    else if (ret[i] == BAD_VOLUME)
      printf("gmount: %s: no such mount device\n", mp2[i]);
    else printf("gmount: %s on %s: unknown error [%d]\n",mp1[i],mp2[i],
		ret[i]);
  }
}
#endif GMOUNT
#ifdef GUMOUNT
void doumount(serv, mp1, umount_options)
     Server *serv;
     char *mp1;
     int umount_options;
{
  int ret;
  ret = GUmount(serv, mp1, umount_options);
  if (ret == PERMISSION_DENIED)
    printf("gumount: %s: permission denied\n", mp1);
  else if (ret == NO_ERROR)
    printf("gumount: %s unmounted\n",mp1);
  else if (ret == BAD_VOLUME)
    printf("gumount: %s: no such mount device\n",mp1);
  else printf("gumount: %s: unknown error [%d]\n", mp1, ret);
}
void domultiumount(serv, num_mps, mp1, umount_options)
     Server *serv;
     int num_mps, umount_options;
     char **mp1;
{
  int *ret, i;
  ret = (int *)malloc(num_mps * sizeof(int));
  GUmounts(serv, num_mps, mp1, ret, umount_options);
  for (i = 0; i < num_mps; i++) {
    if (ret[i] == PERMISSION_DENIED)
      printf("gumount: %s: permission denied\n", mp1[i]);
    else if (ret[i] == NO_ERROR)
      printf("gumount: %s unmounted\n",mp1[i]);
    else if (ret[i] == BAD_VOLUME)
      printf("gumount: %s: no such mount device\n",mp1[i]);
    else printf("gumount: %s: unknown error [%d]\n", mp1[i], ret[i]);
  }
}
#endif GUMOUNT
