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

int DoMount(sock, hostcommand, i)
     int sock, i;
     Galatea_packet *hostcommand;
{
  int j, intable = 0, k, ret, any_good = 0;
  char *dev_name, *disc_name;

  for (k = 0; k < hostcommand->parm[1]; k++) {

    if ((dev_name = serv_acceptstring(sock, MAX_BLOCK)) == NULL) return(-1);
    if ((disc_name = serv_acceptstring(sock, MAX_BLOCK)) == NULL) {
      free(dev_name);
      return(-1);
    }
    
    if (!islocal(i)) {
      ret = PERMISSION_DENIED;
      free(dev_name);
      free(disc_name);
      if (sendint(sock, ret) == -1) return(-1);
      continue;
    }
    intable = 0;
    for (j = 0; j < mtbl.nmounts; j++) {
      if (!strcmp(mtbl.mount_info[j].dev_name,dev_name) &&
	  mtbl.mount_info[j].realvol) {
	if (strlen(disc_name))
	  strcpy(mtbl.mount_info[j].disc_name,disc_name);
	else
	  strcpy(mtbl.mount_info[j].disc_name, dev_name);
	if (!strcmp(disc_name, "[nothing]"))
	  mtbl.mount_info[j].mountable = 0;
	else
	  mtbl.mount_info[j].mountable = 1;
	intable = 1;
      }
    }
    
    if (!intable) {
      if (DEBUG) printf("Failed mount request for %s on %s\n",
			disc_name,dev_name);
      ret = BAD_VOLUME;
    }
    else {
      if (DEBUG) printf("Mount request for %s on %s\n",
			disc_name, dev_name);
      ret = NO_ERROR;
      any_good = 1;
    }
    free(dev_name);
    free(disc_name);
    if (sendint(sock, ret) == -1) return(-1);
  }
  if (any_good) {
    write_mount_file();
    need_to_rebuild_list = 1;
  }
  return(-2);
}

int DoUmount(sock, hostcommand, i)
     int sock, i;
     Galatea_packet *hostcommand;
{
  int j, intable = 0, k, any_good = 0, ret;
  char *dev_name;
  int vol_num, dev_num;
  RPD_ptr rpd;
  
  for (dev_num = 0; dev_num < num_players; dev_num++)
    players[dev_num]->scratch = 0;

  for (k = 0; k < hostcommand->parm[1]; k++) {
    
    if ((dev_name = serv_acceptstring(sock,MAX_BLOCK)) == NULL) return(-1);
    
    if (!islocal(i)) {
      ret = PERMISSION_DENIED;
      free(dev_name);
      if (sendint(sock,ret) == -1) return(-1);
      continue;
    }
    intable = 0;
    for (j = 0; j < mtbl.nmounts; j++) {
      if ((!strcmp(mtbl.mount_info[j].dev_name,dev_name) ||
	   !strcmp(mtbl.mount_info[j].disc_name,dev_name)) &&
	  mtbl.mount_info[j].realvol) {
	mtbl.mount_info[j].mountable = 0;
	intable = 1;

	if (hostcommand->parm[2] == EJECT) {
	  if (DEBUG) printf("Ejecting %s during umount\n",dev_name);
	    for (dev_num = 0; dev_num < num_players; dev_num++) {
	      if (!strcmp(players[dev_num]->devname, 
			  mtbl.mount_info[j].disc_name) ||
		  !strcmp(players[dev_num]->devname,
			  mtbl.mount_info[j].dev_name)) {
		players[dev_num]->scratch = 1;
		if (DEBUG) printf("Marking device %d\n",dev_num);
	      }
	    }
	}
      }
    }
    if (!intable) {
      if (DEBUG) printf("Failed umount request for %s\n",dev_name);
      ret = BAD_VOLUME;
    }
    else {
      if (DEBUG) printf("Umount request for %s\n",dev_name);
      ret = NO_ERROR;
      any_good = 1;
    }
    free(dev_name);
    if (sendint(sock, ret) == -1) return(-1);
  }
  if (any_good) {
    write_mount_file();
    need_to_rebuild_list = 1;
    if (hostcommand->parm[2] == EJECT) {
      for (dev_num = 0; dev_num < num_players; dev_num++) {
	if (players[dev_num]->scratch) {
	  rpd = players[dev_num];
	  if (DEBUG) printf("Ejecting device %d\n", dev_num);
	  (*rpd->cmd)(rpd,EJECT);
	}
      }
    }
  }
  return(-2);
}
/*ARGSUSED*/
int DoGetMounts(msgsock, hostcommand, i)
     int msgsock, i;
     Galatea_packet *hostcommand;
{
  int j;

  if (sendint(msgsock, mtbl.nmounts) == -1) return(-1);
  for (j = 0; j < mtbl.nmounts; j++) {
    if (sendstring(msgsock, mtbl.mount_info[j].dev_name) == -1) return(-1);
    if (mtbl.mount_info[j].mountable) {
      if (sendstring(msgsock, mtbl.mount_info[j].disc_name) == -1) return(-1);
    }
    else
      if (sendstring(msgsock, "[nothing]") == -1) return(-1);
  }
  return(-2);
}
