/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* |_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; }