|
From: Brenda L. <asp...@us...> - 2003-05-12 07:26:29
|
Update of /cvsroot/squeak/squeak/platforms/unix/plugins/FileCopyPlugin In directory sc8-pr-cvs1:/tmp/cvs-serv30143/plugins/FileCopyPlugin Added Files: sqUnixFileCopyPlugin.c Log Message: Ian Piumarta's release 3.4.1 --- NEW FILE: sqUnixFileCopyPlugin.c --- /* sqUnixFileCopyPlugin.c -- fast file copy, preserving permissions * * Copyright (C) 1996-2002 Ian Piumarta and other authors/contributors * as listed elsewhere in this file. * All rights reserved. * * This file is part of Unix Squeak. * * This file is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * You may use and/or distribute this file ONLY as part of Squeak, under * the terms of the Squeak License as described in `LICENSE' in the base of * this distribution, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment to the original author(s) (and any * other contributors mentioned herein) in the product documentation * would be appreciated but is not required. * * 2. This notice must not be removed or altered in any source distribution. * * Using (or modifying this file for use) in any context other than Squeak * changes these copyright conditions. Read the file `COPYING' in the * directory `platforms/unix/doc' before proceeding with any such use. * * You are not allowed to distribute a modified version of this file * under its original name without explicit permission to do so. If * you change it, rename it. * * Author: ian...@in... * * Last edited: 2002-10-26 14:33:09 by piumarta on emilia.inria.fr * * NOTE: * This plugin is kind of ridiculous. Nevertheless, after seeing what * somebody (and I honestly have no idea who) decided would be a good * implementation of this (it might still be on SourceForge if you're * perverse wough to want to look at it) I was dumbfounded into writing * a version that didn't open pipes to forked processes. (Now I bet * you can't possibly resist having a peek for the original. ;^p) * (Besides, the original version had BUGS -- in a one page program. 8^o) * * CAVEATS: * - we should use mmap() only if the file is "large" (define that as * you will), preferring a few block-sized read()/write()s otherwise * - we should fall back onto the loop if mmap fails (we might simply * have a file larger than available memory) * * BUGS: * - some of the system calls should handle EAGAIN and/or EINTR (this * will cause problems on Solaris) * (the following could be fixed if we had a real "config.h":) * - we assume <unistd.h> but not everyone has this * - we assume alloca() but not everyone has this (ANSI does not define it) * - use of stat.st_blksize is extremely non-portable * * COMPILE: * gcc -Wall -W -pedantic -o copy copy.c */ #include "sq.h" #include "FileCopyPlugin.h" #include "config.h" #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #ifdef HAVE_UNISTD_H # include <unistd.h> #endif #ifdef HAVE_MMAP # include <sys/mman.h> #endif static int copy(char *from, char *to) { int status= 1; /* exit status: assume failure */ int in; struct stat stat; if (((in= open(from, O_RDONLY)) < 0) || (fstat(in, &stat) != 0)) return -1; { int out; if ((out= open(to, O_WRONLY | O_CREAT | O_TRUNC, stat.st_mode)) < 0) return -1; { # ifdef HAVE_MMAP static const char *_dev_zero= "/dev/zero"; int zero; if ((zero= open(_dev_zero, O_RDWR)) >= 0) { void *mem; if (MAP_FAILED != (mem= mmap(0, stat.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, zero, 0))) { if (( (read(in, mem, stat.st_size) != stat.st_size) >= 0) && (write(out, mem, stat.st_size) != stat.st_size) >= 0) { status= 0; /* success */ } munmap(mem, stat.st_size); } close(zero); } # else /* !HAVE_MMAP */ char *buf= (char *)alloca(stat.st_blksize); int n; while (( ((n= read(in, buf, stat.st_blksize)) > 0)) && (n == write(out, buf, n))) ; if (n == 0) status= 0; /* success */ # endif /* !HAVE_MMAP */ close(out); } close(in); } return status; } int sqCopyFilesizetosize(char *srcName, int srcNameSize, char *dstName, int dstNameSize) { int status= 0; char *from= (char *)alloca(srcNameSize + 1); char *to= (char *)alloca(dstNameSize + 1); sqFilenameFromString(from, srcName, srcNameSize); sqFilenameFromString(to, dstName, dstNameSize); return copy(from, to); } |