/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery.  All Rights  */
/* |. o.| || Reserved.  This program may not be distributed without the    */
/* | .  | || permission of the authors:                            BBS:    */
/* | o  | ||   John Toebes     Doug Walker    Dave Baker                   */
/* |  . |//                                                                */
/* ======                                                                  */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* File Manipulation  */
/*  ActDelete ActRename ActSetProtection ActSetComment */
#include "handler.h"

void ActDelete(global, pkt)
GLOBAL global;
struct DosPacket *pkt;              /* a pointer to the dos packet sent    */
/* Arg1: Lock	*/
/* Arg2: Name	*/
{
   NETPTR nlock;
   struct FileLock *flock;
   BUG(("ActDelete\n"));

   /* Can't delete in the root of NET: */
   if((!(flock=(struct FileLock *)pkt->dp_Arg1) || 
       !(nlock=(NETPTR)flock->fl_Key)->RDevice))
   {
      if(ParseName(global, (char *)pkt->dp_Arg2, &nlock, global->RP.Data) || 
         !nlock)
      {
         /* Either he is trying to delete a node or he got the name wrong */
         pkt->dp_Res1 = DOS_FALSE;
         pkt->dp_Res2 = (nlock ? ERROR_OBJECT_IN_USE
                               : ERROR_WRITE_PROTECTED);
         return;
      }
      BUGBSTR("RmtDelete: Sending to node ", nlock->NetNode->name);
   }
   else
      MBSTR(pkt->dp_Arg2, global->RP.Data);

   BUGBSTR("RmtDelete: remote node name =", global->RP.Data);

   global->RP.Type = pkt->dp_Type;
   global->RP.Arg1 = (LONG)nlock->RPtr;
   global->RP.DLen = BSTRLEN(global->RP.Data)+1;
   if(global->RP.DLen == 1) global->RP.DLen = 0;

   RemotePacket(global, nlock);
}

void ActRename(global,pkt)
GLOBAL global;
struct DosPacket *pkt;              /* a pointer to the dos packet sent	*/
/* Arg1: FromLock	*/
/* Arg2: FromName	*/
/* Arg3: ToLock		*/
/* Arg4: ToName		*/
{
   NETPTR nlock, nlock2;
   struct FileLock *flock;
   char *tmpchar;

   BUG(("ActRename\n"));

   /* See if it is a local lock */   
   if((!(flock=(struct FileLock *)pkt->dp_Arg1) || 
       !(nlock=(NETPTR)flock->fl_Key)->RDevice))
   {
      if(ParseName(global, (char *)pkt->dp_Arg2, &nlock, global->RP.Data) ||
         !nlock)
      {
         /* Trying to rename a node, or something that doesn't exist */
         pkt->dp_Res1 = DOS_FALSE;
         pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;
         return;
      }
   }
   else
      MBSTR(pkt->dp_Arg2, global->RP.Data);

   /* See if the second lock is a local lock */   
   if((!(flock=(struct FileLock *)pkt->dp_Arg3) || 
       !(nlock2=(NETPTR)flock->fl_Key)->RDevice))
   {
      if(ParseName(global, (char *)pkt->dp_Arg4, &nlock, 
          global->RP.Data+FILENAMELEN) || !nlock2)
      {
         /* See if they are trying to rename a node */
         if(global->RP.Data[0] == 1 && global->RP.Data[1] == ':')
         {
            tmpchar = global->RP.Data+FILENAMELEN;
            if(tmpchar[0] > RNAMELEN) tmpchar[0] = RNAMELEN;
            MBSTR(tmpchar, nlock->NetNode->name);
         }
         else
         {
            pkt->dp_Res1 = DOS_FALSE;
            pkt->dp_Res2 = (nlock2 ? ERROR_OBJECT_EXISTS
                                   : ERROR_RENAME_ACROSS_DEVICES);
         }
         return;
      }
   }
   else
      MBSTR(pkt->dp_Arg4, global->RP.Data+FILENAMELEN);

   /* Check for rename across devices */
   if(nlock->NetNode != nlock2->NetNode)
   {
      pkt->dp_Res1 = DOS_FALSE;
      pkt->dp_Res2 = ERROR_RENAME_ACROSS_DEVICES;
      return;
   }

   global->RP.Type = pkt->dp_Type;
   global->RP.Arg1 = (LONG)nlock->RPtr;
   global->RP.Arg3 = (LONG)nlock2->RPtr;
   global->RP.DLen = FILENAMELEN + BSTRLEN(global->RP.Data+FILENAMELEN)+1;

   RemotePacket(global, nlock);
}

void ActSetProtection(global, pkt)
GLOBAL global;
struct DosPacket *pkt;              /* a pointer to the dos packet sent */
/* Arg1: Unused */
/* Arg2: Lock */
/* Arg3: Name */
/* Arg4: Mask of protection */
{
   struct FileLock *flock;
   NETPTR nlock;

   BUG(("ActSetProtection\n"));

   BUGBSTR("File to protect: ", pkt->dp_Arg3);

   if((!(flock=(struct FileLock *)pkt->dp_Arg2) || 
       !(nlock=(NETPTR)flock->fl_Key)->RDevice))
   {
      /* Local lock - protection not implemented yet */
      pkt->dp_Res1 = DOS_TRUE;
      return;
   }

   global->RP.Type = pkt->dp_Type;
   global->RP.Arg2 = (LONG)nlock->RPtr;
   MBSTR(pkt->dp_Arg3, global->RP.Data);
   global->RP.Arg4 = pkt->dp_Arg4;
   global->RP.DLen = BSTRLEN(global->RP.Data)+1;
   if(global->RP.DLen == 1) global->RP.DLen = 0;

   RemotePacket(global, nlock);
}

void ActSetComment(global,pkt)
GLOBAL global;
struct DosPacket *pkt;              /* a pointer to the dos packet sent       */
/* Arg1: Unused */
/* Arg2: Lock */
/* Arg3: Name */
/* Arg4: Comment */
{
   struct FileLock *flock;
   NETPTR nlock;

   BUG(("ActSetComment\n"));

   BUGBSTR("File to Comment: ", pkt->dp_Arg3);
   BUGBSTR("New Comment Str: ", pkt->dp_Arg4);

   if((!(flock=(struct FileLock *)pkt->dp_Arg2) || 
       !(nlock=(NETPTR)flock->fl_Key)->RDevice))
   {
      /* Can't SetComment local nodes */
      pkt->dp_Res1 = DOS_TRUE;
      return;
   }

   global->RP.Type = pkt->dp_Type;
   global->RP.Arg2 = (LONG)nlock->RPtr;
   MBSTR(pkt->dp_Arg3, global->RP.Data);
   MBSTR(pkt->dp_Arg4, global->RP.Data+FILENAMELEN);
   global->RP.DLen = FILENAMELEN + BSTRLEN(global->RP.Data+FILENAMELEN)+1;

   RemotePacket(global, nlock);
}

void ActSetFileDate(global, pkt)
GLOBAL global;
struct DosPacket *pkt;
{
   pkt->dp_Res1 = DOS_FALSE;
   pkt->dp_Res2 = ERROR_NODE_DOWN;
}
