mirror of
https://github.com/ctm/executor.git
synced 2024-06-05 23:29:33 +00:00
281 lines
6.7 KiB
C
281 lines
6.7 KiB
C
/* Copyright 1986-1995 by Abacus Research and
|
|
* Development, Inc. All rights reserved.
|
|
*/
|
|
|
|
#if !defined (OMIT_RCSID_STRINGS)
|
|
char ROMlib_rcsid_fileCreate[] =
|
|
"$Id: fileCreate.c 63 2004-12-24 18:19:43Z ctm $";
|
|
#endif
|
|
|
|
/* Forward declarations in FileMgr.h (DO NOT DELETE THIS LINE) */
|
|
|
|
#include "rsys/common.h"
|
|
#include "QuickDraw.h"
|
|
#include "FileMgr.h"
|
|
#include "OSEvent.h"
|
|
#include "VRetraceMgr.h"
|
|
#include "OSUtil.h"
|
|
|
|
#include "rsys/file.h"
|
|
#include "rsys/glue.h"
|
|
#include "rsys/filedouble.h"
|
|
#include "rsys/suffix_maps.h"
|
|
|
|
A4(PUBLIC, OSErr, Create, StringPtr, filen, INTEGER, vrn, /* IMIV-112 */
|
|
OSType, creator, OSType, filtyp)
|
|
{
|
|
ParamBlockRec pbr;
|
|
OSErr temp;
|
|
LONGINT t;
|
|
|
|
pbr.fileParam.ioNamePtr = RM(filen);
|
|
pbr.fileParam.ioVRefNum = CW(vrn);
|
|
pbr.fileParam.ioFVersNum = 0;
|
|
|
|
temp = PBCreate(&pbr, 0);
|
|
if (temp != noErr)
|
|
return(temp);
|
|
|
|
OSASSIGN(pbr.fileParam.ioFlFndrInfo.fdType, CL(filtyp));
|
|
OSASSIGN(pbr.fileParam.ioFlFndrInfo.fdCreator, CL(creator));
|
|
pbr.fileParam.ioFlFndrInfo.fdFlags = 0;
|
|
ZEROPOINT(pbr.fileParam.ioFlFndrInfo.fdLocation);
|
|
pbr.fileParam.ioFlFndrInfo.fdFldr = 0;
|
|
|
|
GetDateTime(&t);
|
|
pbr.fileParam.ioFlCrDat = t;
|
|
pbr.fileParam.ioFlMdDat = t;
|
|
|
|
temp = PBSetFInfo(&pbr, 0);
|
|
/*
|
|
* The dodge below of not returning fnfErr is necessary because people might
|
|
* want to create a file in a directory without a .Rsrc. This has some
|
|
* unpleasant side effects (notably no file type and no logical eof), but we
|
|
* allow it anyway (for now).
|
|
*/
|
|
return temp == fnfErr ? noErr : temp;
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, FSDelete, StringPtr, filen, INTEGER, vrn) /* IMIV-113 */
|
|
{
|
|
ParamBlockRec pbr;
|
|
|
|
pbr.fileParam.ioNamePtr = RM(filen);
|
|
pbr.fileParam.ioVRefNum = CW(vrn);
|
|
pbr.fileParam.ioFVersNum = 0;
|
|
return(PBDelete(&pbr, 0));
|
|
}
|
|
|
|
A4(PRIVATE, OSErr, PBCreateForD, ParmBlkPtr, pb, BOOLEAN, a,
|
|
FOrDType, ford, LONGINT, dir)
|
|
{
|
|
char *pathname;
|
|
OSErr err;
|
|
int fd;
|
|
VCBExtra *vcbp;
|
|
LONGINT dirid;
|
|
ParamBlockRec newparam;
|
|
|
|
pathname = 0;
|
|
/* Find out where this new entity should reside */
|
|
if ((err = ROMlib_nami(pb, dir, NoIndex, &pathname, (char **)0, (char **)0,
|
|
TRUE, &vcbp, (struct stat *) 0)) == noErr &&
|
|
(err = volumenotlocked(vcbp)) == noErr) {
|
|
if (ford == File)
|
|
fd = Uopen(pathname, O_BINARY|O_CREAT|O_EXCL, 0666L);
|
|
else {
|
|
fd = Umkdir(pathname, 0777);
|
|
if (fd >= 0) {
|
|
dirid = 0;
|
|
ROMlib_dbm_store(vcbp, pathname, &dirid, TRUE);
|
|
((HParmBlkPtr) pb)->fileParam.ioDirID = CL(dirid);
|
|
}
|
|
}
|
|
|
|
if (fd < 0) {
|
|
switch (errno) {
|
|
case EACCES:
|
|
#if defined(EROFS)
|
|
case EROFS:
|
|
#endif /* defined(EROFS) */
|
|
err = wPrErr;
|
|
break;
|
|
case ENOSPC:
|
|
#if defined (EDQUOT)
|
|
case EDQUOT:
|
|
#endif /* EDQUOT */
|
|
err = dirFulErr;
|
|
break;
|
|
case EEXIST:
|
|
err = dupFNErr;
|
|
break;
|
|
default:
|
|
err = ioErr;
|
|
/* fprintf(stderr, "%s(%d): ioErr returned\n", __FILE__, __LINE__); */
|
|
break;
|
|
}
|
|
} else {
|
|
if (ford == File)
|
|
(void) Uclose(fd);
|
|
}
|
|
}
|
|
if (err == noErr)
|
|
ROMlib_rewinddir();
|
|
if (err == noErr) {
|
|
LONGINT swapped_dir;
|
|
|
|
TRANSFER_ASSIGN (newparam.fileParam, pb->fileParam);
|
|
memset(&newparam.fileParam.ioFlFndrInfo, 0,
|
|
sizeof(newparam.fileParam.ioFlFndrInfo));
|
|
memset(&newparam.fileParam.ioFlCrDat, 0,
|
|
sizeof(newparam.fileParam.ioFlCrDat));
|
|
memset(&newparam.fileParam.ioFlMdDat, 0,
|
|
sizeof(newparam.fileParam.ioFlMdDat));
|
|
swapped_dir = CL(dir);
|
|
if (!ROMlib_creator_and_type_from_filename (strlen (pathname),
|
|
pathname, NULL, NULL))
|
|
ROMlib_PBGetSetFInfoD(&newparam, FALSE, Set, &swapped_dir, FALSE);
|
|
}
|
|
if (pathname)
|
|
free (pathname);
|
|
return err;
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, ufsPBCreate, ParmBlkPtr, pb, BOOLEAN, a) /* INTERNAL */
|
|
{
|
|
return PBCreateForD(pb, a, File, 0);
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, ufsPBHCreate, HParmBlkPtr, pb, /* INTERNAL */
|
|
BOOLEAN, a)
|
|
{
|
|
return PBCreateForD((ParmBlkPtr) pb, a, File, Cx(pb->fileParam.ioDirID));
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, ufsPBDirCreate, HParmBlkPtr, pb, /* INTERNAL */
|
|
BOOLEAN, a)
|
|
{
|
|
return PBCreateForD((ParmBlkPtr) pb, a, Directory, Cx(pb->fileParam.ioDirID));
|
|
}
|
|
|
|
A4(PRIVATE, OSErr, PBDeleteForD, ParmBlkPtr, pb, BOOLEAN, a,
|
|
FOrDType, ford, LONGINT, dir)
|
|
{
|
|
char *pathname, *filename, *endname, *rpathname;
|
|
OSErr err;
|
|
int deletefailed;
|
|
VCBExtra *vcbp;
|
|
struct stat sbuf;
|
|
|
|
pathname = 0;
|
|
rpathname = 0;
|
|
/* Find out where this new entity should reside */
|
|
if ((err = ROMlib_nami(pb, dir, NoIndex, &pathname, &filename, &endname,
|
|
TRUE, &vcbp, &sbuf)) == noErr &&
|
|
(err = volumenotlocked(vcbp)) == noErr) {
|
|
|
|
rpathname = ROMlib_resname(pathname, filename, endname);
|
|
deletefailed = Uunlink(rpathname);
|
|
if (netatalk_conventions_p)
|
|
double_dir_op (pathname, rmdir_op);
|
|
if (!deletefailed || errno == ENOTDIR || errno == ENOENT)
|
|
deletefailed = Uunlink(pathname);
|
|
if (deletefailed && ford == Directory) {
|
|
struct stat sbuf;
|
|
|
|
if (Ustat (pathname, &sbuf) != 0)
|
|
deletefailed = TRUE;
|
|
else
|
|
{
|
|
if ((deletefailed = Urmdir(pathname)) == 0)
|
|
ROMlib_dbm_delete_inode (vcbp, ST_INO (sbuf));
|
|
}
|
|
}
|
|
if (deletefailed)
|
|
switch (errno) {
|
|
case ENOTDIR:
|
|
warning_trace_info ("pathname = '%s', rpathname = '%s'",
|
|
pathname, rpathname);
|
|
err = dirNFErr;
|
|
break;
|
|
|
|
#if defined(EBUSY)
|
|
case EBUSY:
|
|
#endif /* defined(EBUSY) */
|
|
#if defined (ENOTEMPTY)
|
|
case ENOTEMPTY:
|
|
#endif /* ENOTEMPTY */
|
|
#if defined(EFAULT)
|
|
case EFAULT:
|
|
#endif /* defined(EFAULT) */
|
|
err = fBsyErr;
|
|
break;
|
|
|
|
case EINVAL:
|
|
#if defined (ENAMETOOLONG)
|
|
case ENAMETOOLONG:
|
|
#endif /* ENAMETOOLONG */
|
|
#if defined (ELOOP)
|
|
case ELOOP:
|
|
#endif /* ELOOP */
|
|
err = bdNamErr;
|
|
break;
|
|
|
|
case ENOENT:
|
|
err = fnfErr;
|
|
break;
|
|
|
|
case EPERM:
|
|
err = fLckdErr;
|
|
break;
|
|
|
|
case EIO:
|
|
err = ioErr;
|
|
/* fprintf(stderr, "%s(%d): ioErr returned\n", __FILE__, __LINE__); */
|
|
break;
|
|
|
|
#if (EACCES != EPERM)
|
|
case EACCES:
|
|
#if defined (CYGWIN32)
|
|
err = fBsyErr;
|
|
break;
|
|
#endif
|
|
#endif /* (EACCESS != EPERM) */
|
|
#if defined(EROFS)
|
|
case EROFS:
|
|
#endif /* defined(EROFS) */
|
|
err = wPrErr;
|
|
break;
|
|
case ENOSPC:
|
|
#if defined (EDQUOT)
|
|
case EDQUOT:
|
|
#endif /* EDQUOT */
|
|
err = dirFulErr;
|
|
break;
|
|
case EEXIST:
|
|
err = dupFNErr;
|
|
break;
|
|
default:
|
|
err = ioErr;
|
|
/* fprintf(stderr, "%s(%d): ioErr returned\n", __FILE__, __LINE__); */
|
|
break;
|
|
}
|
|
}
|
|
if (pathname)
|
|
free (pathname);
|
|
if (rpathname)
|
|
free (rpathname);
|
|
return err;
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, ufsPBDelete, ParmBlkPtr, pb, BOOLEAN, a)/* INTERNAL */
|
|
{
|
|
return PBDeleteForD(pb, a, File, 0);
|
|
}
|
|
|
|
A2(PUBLIC, OSErr, ufsPBHDelete, HParmBlkPtr, pb, /* INTERNAL */
|
|
BOOLEAN, a)
|
|
{
|
|
return PBDeleteForD((ParmBlkPtr) pb, a, Directory, Cx(pb->fileParam.ioDirID));
|
|
}
|