// FTP access generator
// 31 may 93 Chrisy
// Modified for RoD Chrisy 15 June 1993
#include <standard.h>
#include "/secure/master.h"
#define OUTFILE "/secure/ftp_access.inf"
#define SAVEFILE "/secure/ftp_access"
#define MASTERFILE MASTER
// restored from master.o
mapping positions;
mapping permissions;
// Globals :)
mapping perms;
int make_perms_active;
// prototypes
void make_perms();
// functions
int query_prevent_shadow() { return 1; }
nomask void create()
{
  seteuid(getuid());
  if(file_length(MASTERFILE+".o"))
    restore_object(MASTERFILE,1);
  permissions = MASTER->query_permissions();
  perms = ([ ]);
  if(!positions) positions = ([]);
  if(!permissions) permissions = (["":([]) ]);
  make_perms();
}
nomask void dest_me()
{
  destruct(this_object());
}
nomask void save_me()
{
  string *nams, *paths;
  mapping acc;
  int sz, asz, i, j;
  save_object(SAVEFILE,1);
  rm(OUTFILE);
  write_file(OUTFILE, "# This file is generated by the "+
      "Mudlib.\n# You shouldn't change it.\n"+
      "# Created: "+ctime(time())+".\n");
  nams = keys(perms);
  sz = sizeof(nams);
  for(i=0; i<sz; i++)
  {
    acc = perms[nams[i]];
    paths = keys(acc);
    asz = sizeof(paths);
    for(j=0; j<asz; j++)
      write_file(OUTFILE, sprintf("%s %s %d\n", nams[i],
          paths[j], acc[paths[j]]));
  }
  SETEUID;
}
void make_perms()
{
  if(make_perms_active)
    return;
  call_out("do_make_perms", 0);
  make_perms_active = 1;
}
void do_make_perms()
{
  string *paths, *nams;
  mapping acc;
  int sz, nsz, i, j;
  make_perms_active = 0;
  paths = keys(permissions);
  sz = sizeof(paths);
  
  for(i=0; i<sz; i++)
  {
    acc = permissions[paths[i]];
  if(!mappingp(acc)) acc = ([ ]);
    nams = keys(acc);
    nsz = sizeof(nams);
    for(j=0; j<nsz; j++)
    {
      if(!perms[nams[j]])
        perms[nams[j]] = ([ ]);
      if(acc[nams[j]]&WRITE_MASK) acc[nams[j]] |= READ_MASK;
      perms[nams[j]][paths[i]] = acc[nams[j]];
    }
  }
  nams = keys(positions);
  nsz = sizeof(nams);
  for(i=0; i<nsz; i++)
  {
    if(!perms[nams[i]])
      perms[nams[i]] = ([ ]);
    switch(positions[nams[i]])
    {
    case LORD:
      perms[nams[i]]["/d"] = READ_MASK|WRITE_MASK;
      break;
    case HIGH_LORD:
      perms[nams[i]]["/"] = READ_MASK|WRITE_MASK;
      break;
    }
    perms[nams[i]]["/w/"+nams[i]] = READ_MASK|WRITE_MASK;
  }
  save_me();
}