⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclmacfcmd.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  * tclMacFCmd.c -- * * Implements the Macintosh specific portions of the file manipulation * subcommands of the "file" command. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tclMacFCmd.c 1.22 97/05/20 15:44:26 */#include "tclInt.h"#include "tclMac.h"#include "tclMacInt.h"#include "tclPort.h"#include <FSpCompat.h>#include <MoreFilesExtras.h>#include <Strings.h>#include <Errors.h>#include <FileCopy.h>#include <DirectoryCopy.h>#include <Script.h>#include <string.h>#include <Finder.h>/* * Callback for the file attributes code. */static int		GetFileFinderAttributes _ANSI_ARGS_((Tcl_Interp *interp,			    int objIndex, char *fileName,			    Tcl_Obj **attributePtrPtr));static int		GetFileReadOnly _ANSI_ARGS_((Tcl_Interp *interp,			    int objIndex, char *fileName,			    Tcl_Obj **readOnlyPtrPtr));static int		SetFileFinderAttributes _ANSI_ARGS_((Tcl_Interp *interp,			    int objIndex, char *fileName,			    Tcl_Obj *attributePtr));static int		SetFileReadOnly _ANSI_ARGS_((Tcl_Interp *interp,			    int objIndex, char *fileName,			    Tcl_Obj *readOnlyPtr));/* * These are indeces into the tclpFileAttrsStrings table below. */#define MAC_CREATOR_ATTRIBUTE	0#define MAC_HIDDEN_ATTRIBUTE	1#define MAC_READONLY_ATTRIBUTE	2#define MAC_TYPE_ATTRIBUTE	3/* * Global variables for the file attributes code. */char *tclpFileAttrStrings[] = {"-creator", "-hidden", "-readonly",	"-type", (char *) NULL};CONST TclFileAttrProcs tclpFileAttrProcs[] = {	{GetFileFinderAttributes, SetFileFinderAttributes},	{GetFileFinderAttributes, SetFileFinderAttributes},	{GetFileReadOnly, SetFileReadOnly},	{GetFileFinderAttributes, SetFileFinderAttributes}};/* * Prototypes for procedure only used in this file */static pascal Boolean 	CopyErrHandler _ANSI_ARGS_((OSErr error, 			    short failedOperation,			    short srcVRefNum, long srcDirID,			    StringPtr srcName, short dstVRefNum,			    long dstDirID,StringPtr dstName));OSErr			FSpGetFLockCompat _ANSI_ARGS_((const FSSpec *specPtr, 			    Boolean *lockedPtr));static OSErr		GenerateUniqueName _ANSI_ARGS_((short vRefNum, 			    long dirID1, long dirID2, Str31 uniqueName));static OSErr		GetFileSpecs _ANSI_ARGS_((char *path, FSSpec *pathSpecPtr,			    FSSpec *dirSpecPtr,	Boolean *pathExistsPtr,				    Boolean *pathIsDirectoryPtr));static OSErr		MoveRename _ANSI_ARGS_((const FSSpec *srcSpecPtr, 			    const FSSpec *dstSpecPtr, StringPtr copyName));static int		Pstrequal _ANSI_ARGS_((ConstStr255Param stringA, 			    ConstStr255Param stringB));                 /* *--------------------------------------------------------------------------- * * TclpRenameFile -- * *      Changes the name of an existing file or directory, from src to dst. *	If src and dst refer to the same file or directory, does nothing *	and returns success.  Otherwise if dst already exists, it will be *	deleted and replaced by src subject to the following conditions: *	    If src is a directory, dst may be an empty directory. *	    If src is a file, dst may be a file. *	In any other situation where dst already exists, the rename will *	fail.   * * Results: *	If the directory was successfully created, returns TCL_OK. *	Otherwise the return value is TCL_ERROR and errno is set to *	indicate the error.  Some possible values for errno are: * *	EACCES:     src or dst parent directory can't be read and/or written. *	EEXIST:	    dst is a non-empty directory. *	EINVAL:	    src is a root directory or dst is a subdirectory of src. *	EISDIR:	    dst is a directory, but src is not. *	ENOENT:	    src doesn't exist.  src or dst is "". *	ENOTDIR:    src is a directory, but dst is not.   *	EXDEV:	    src and dst are on different filesystems. *	 * Side effects: *	The implementation of rename may allow cross-filesystem renames, *	but the caller should be prepared to emulate it with copy and *	delete if errno is EXDEV. * *--------------------------------------------------------------------------- */intTclpRenameFile(     char *src,    		/* Pathname of file or dir to be renamed. */    char *dst)     		/* New pathname for file or directory. */{    FSSpec srcFileSpec, dstFileSpec, dstDirSpec;    OSErr err;     long srcID, dummy;    Boolean srcIsDirectory, dstIsDirectory, dstExists, dstLocked;    err = FSpLocationFromPath(strlen(src), src, &srcFileSpec);    if (err == noErr) {	FSpGetDirectoryID(&srcFileSpec, &srcID, &srcIsDirectory);    }    if (err == noErr) {        err = GetFileSpecs(dst, &dstFileSpec, &dstDirSpec, &dstExists,         	&dstIsDirectory);    }    if (err == noErr) {	if (dstExists == 0) {            err = MoveRename(&srcFileSpec, &dstDirSpec, dstFileSpec.name);            goto end;        }        err = FSpGetFLockCompat(&dstFileSpec, &dstLocked);        if (dstLocked) {            FSpRstFLockCompat(&dstFileSpec);        }    }    if (err == noErr) {        if (srcIsDirectory) {	    if (dstIsDirectory) {		/*		 * The following call will remove an empty directory.  If it		 * fails, it's because it wasn't empty.		 */		                 if (TclpRemoveDirectory(dst, 0, NULL) != TCL_OK) {                    return TCL_ERROR;                }                                /*		 * Now that that empty directory is gone, we can try		 * renaming src.  If that fails, we'll put this empty		 * directory back, for completeness.		 */		err = MoveRename(&srcFileSpec, &dstDirSpec, dstFileSpec.name);                if (err != noErr) {		    FSpDirCreateCompat(&dstFileSpec, smSystemScript, &dummy);		    if (dstLocked) {		        FSpSetFLockCompat(&dstFileSpec);		    }		}	    } else {	        errno = ENOTDIR;	        return TCL_ERROR;	    }	} else {   	    if (dstIsDirectory) {		errno = EISDIR;		return TCL_ERROR;	    } else {                                		/*		 * Overwrite existing file by:		 * 		 * 1. Rename existing file to temp name.		 * 2. Rename old file to new name.		 * 3. If success, delete temp file.  If failure,		 *    put temp file back to old name.		 */	        Str31 tmpName;	        FSSpec tmpFileSpec;	        err = GenerateUniqueName(dstFileSpec.vRefNum, 	        	dstFileSpec.parID, dstFileSpec.parID, tmpName);	        if (err == noErr) {	            err = FSpRenameCompat(&dstFileSpec, tmpName);	        }	        if (err == noErr) {	            err = FSMakeFSSpecCompat(dstFileSpec.vRefNum,	            	    dstFileSpec.parID, tmpName, &tmpFileSpec);	        }	        if (err == noErr) {	            err = MoveRename(&srcFileSpec, &dstDirSpec, 	            	    dstFileSpec.name);	        }	        if (err == noErr) {		    FSpDeleteCompat(&tmpFileSpec);		} else {		    FSpDeleteCompat(&dstFileSpec);		    FSpRenameCompat(&tmpFileSpec, dstFileSpec.name);	            if (dstLocked) {	            	FSpSetFLockCompat(&dstFileSpec);	            }	        }	    }   	}    }        end:        if (err != noErr) {	errno = TclMacOSErrorToPosixError(err);	return TCL_ERROR;    }    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TclpCopyFile -- * *      Copy a single file (not a directory).  If dst already exists and *	is not a directory, it is removed. * * Results: *	If the file was successfully copied, returns TCL_OK.  Otherwise *	the return value is TCL_ERROR and errno is set to indicate the *	error.  Some possible values for errno are: * *	EACCES:     src or dst parent directory can't be read and/or written. *	EISDIR:	    src or dst is a directory. *	ENOENT:	    src doesn't exist.  src or dst is "". * * Side effects: *      This procedure will also copy symbolic links, block, and *      character devices, and fifos.  For symbolic links, the links  *      themselves will be copied and not what they point to.  For the *	other special file types, the directory entry will be copied and *	not the contents of the device that it refers to. * *--------------------------------------------------------------------------- */ int TclpCopyFile(    char *src,			/* Pathname of file to be copied. */    char *dst)			/* Pathname of file to copy to. */{    OSErr err, dstErr;    Boolean dstExists, dstIsDirectory, dstLocked;    FSSpec srcFileSpec, dstFileSpec, dstDirSpec, tmpFileSpec;    Str31 tmpName;	    err = FSpLocationFromPath(strlen(src), src, &srcFileSpec);    if (err == noErr) {        err = GetFileSpecs(dst, &dstFileSpec, &dstDirSpec, &dstExists,        	&dstIsDirectory);    }    if (dstExists) {        if (dstIsDirectory) {            errno = EISDIR;            return TCL_ERROR;        }        err = FSpGetFLockCompat(&dstFileSpec, &dstLocked);        if (dstLocked) {            FSpRstFLockCompat(&dstFileSpec);        }                /*         * Backup dest file.         */                 dstErr = GenerateUniqueName(dstFileSpec.vRefNum, dstFileSpec.parID,     	        dstFileSpec.parID, tmpName);        if (dstErr == noErr) {            dstErr = FSpRenameCompat(&dstFileSpec, tmpName);        }       }    if (err == noErr) {    	err = FSpFileCopy(&srcFileSpec, &dstDirSpec,     		(StringPtr) dstFileSpec.name, NULL, 0, true);    }    if ((dstExists != false) && (dstErr == noErr)) {        FSMakeFSSpecCompat(dstFileSpec.vRefNum, dstFileSpec.parID,        	tmpName, &tmpFileSpec);	if (err == noErr) {	    /* 	     * Delete backup file. 	     */	     	    FSpDeleteCompat(&tmpFileSpec);	} else {		    /* 	     * Restore backup file.	     */	     	    FSpDeleteCompat(&dstFileSpec);	    FSpRenameCompat(&tmpFileSpec, dstFileSpec.name);	    if (dstLocked) {	        FSpSetFLockCompat(&dstFileSpec);	    }	}    }        if (err != noErr) {	errno = TclMacOSErrorToPosixError(err);	return TCL_ERROR;    }    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TclpDeleteFile -- * *      Removes a single file (not a directory). * * Results: *	If the file was successfully deleted, returns TCL_OK.  Otherwise *	the return value is TCL_ERROR and errno is set to indicate the *	error.  Some possible values for errno are: * *	EACCES:     a parent directory can't be read and/or written. *	EISDIR:	    path is a directory. *	ENOENT:	    path doesn't exist or is "". * * Side effects: *      The file is deleted, even if it is read-only. * *--------------------------------------------------------------------------- */intTclpDeleteFile(     char *path)			/* Pathname of file to be removed. */{    OSErr err;    FSSpec fileSpec;    Boolean isDirectory;    long dirID;	    err = FSpLocationFromPath(strlen(path), path, &fileSpec);    if (err == noErr) {	/*     	 * Since FSpDeleteCompat will delete an empty directory, make sure     	 * that this isn't a directory first.         */                FSpGetDirectoryID(&fileSpec, &dirID, &isDirectory);	if (isDirectory == true) {            errno = EISDIR;            return TCL_ERROR;        }    }    err = FSpDeleteCompat(&fileSpec);    if (err == fLckdErr) {    	FSpRstFLockCompat(&fileSpec);    	err = FSpDeleteCompat(&fileSpec);    	if (err != noErr) {    	    FSpSetFLockCompat(&fileSpec);    	}    }    if (err != noErr) {	errno = TclMacOSErrorToPosixError(err);	return TCL_ERROR;    }    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TclpCreateDirectory -- * *      Creates the specified directory.  All parent directories of the *	specified directory must already exist.  The directory is *	automatically created with permissions so that user can access *	the new directory and create new files or subdirectories in it. * * Results: *	If the directory was successfully created, returns TCL_OK. *	Otherwise the return value is TCL_ERROR and errno is set to *	indicate the error.  Some possible values for errno are: * *	EACCES:     a parent directory can't be read and/or written. *	EEXIST:	    path already exists. *	ENOENT:	    a parent directory doesn't exist. * * Side effects: *      A directory is created with the current umask, except that *	permission for u+rwx will always be added. * *--------------------------------------------------------------------------- */intTclpCreateDirectory(    char *path)			/* Pathname of directory to create. */{    OSErr err;    FSSpec dirSpec;    long outDirID;	    err = FSpLocationFromPath(strlen(path), path, &dirSpec);    if (err == noErr) {        err = dupFNErr;		/* EEXIST. */    } else if (err == fnfErr) {        err = FSpDirCreateCompat(&dirSpec, smSystemScript, &outDirID);    }         if (err != noErr) {	errno = TclMacOSErrorToPosixError(err);	return TCL_ERROR;    }    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TclpCopyDirectory -- * *      Recursively copies a directory.  The target directory dst must *	not already exist.  Note that this function does not merge two *	directory hierarchies, even if the target directory is an an *	empty directory. * * Results: *	If the directory was successfully copied, returns TCL_OK. *	Otherwise the return value is TCL_ERROR, errno is set to indicate *	the error, and the pathname of the file that caused the error *	is stored in errorPtr.  See TclpCreateDirectory and TclpCopyFile *	for a description of possible values for errno. * * Side effects: *      An exact copy of the directory hierarchy src will be created *	with the name dst.  If an error occurs, the error will *      be returned immediately, and remaining files will not be *	processed. * *--------------------------------------------------------------------------- */intTclpCopyDirectory(    char *src,			/* Pathname of directory to be copied.  */    char *dst,			/* Pathname of target directory. */    Tcl_DString *errorPtr)	/* If non-NULL, initialized DString for				 * error reporting. */{    OSErr err, saveErr;    long srcID, tmpDirID;    FSSpec srcFileSpec, dstFileSpec, dstDirSpec, tmpDirSpec, tmpFileSpec;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -