Use MAP_FAILED.

(alloc_buffer): new function for allocating a buffer of size
max(BUFSIZ, st.st_blksize)


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1704 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-05-11 09:58:26 +00:00
parent 0e57a774c9
commit 29fc0dd953

View File

@@ -544,32 +544,73 @@ abortsend(int sig)
#define HASHBYTES 1024 #define HASHBYTES 1024
/*
* Allocate a buffer enough to handle st->st_blksize, if
* there is such a field, otherwise BUFSIZ.
*/
static void *
alloc_buffer (void *oldbuf, size_t *sz, struct stat *st)
{
size_t new_sz;
new_sz = BUFSIZ;
#ifdef HAVE_ST_BLKSIZE
if (st)
new_sz = max(BUFSIZ, st->st_blksize);
#endif
if(new_sz > *sz) {
if (oldbuf)
free (oldbuf);
oldbuf = malloc (new_sz);
if (oldbuf == NULL) {
warn ("malloc");
*sz = 0;
return NULL;
}
*sz = new_sz;
}
return oldbuf;
}
static int static int
copy_stream(FILE *from, FILE *to) copy_stream(FILE *from, FILE *to)
{ {
char buf[BUFSIZ]; static size_t bufsize;
static char *buf;
int n; int n;
int bytes = 0; int bytes = 0;
int werr; int werr;
int hashbytes = HASHBYTES; int hashbytes = HASHBYTES;
struct stat st;
#ifdef HAVE_MMAP #ifdef HAVE_MMAP
struct stat st;
void *chunk; void *chunk;
#ifndef MAP_FAILED
#define MAP_FAILED (-1)
#endif
if(fstat(fileno(from), &st) == 0 && S_ISREG(st.st_mode)){ if(fstat(fileno(from), &st) == 0 && S_ISREG(st.st_mode)){
chunk = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fileno(from), 0); chunk = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fileno(from), 0);
if(chunk != NULL){ if (chunk != (void *)MAP_FAILED) {
sec_write(fileno(to), chunk, st.st_size); int res;
munmap(chunk, st.st_size);
res = sec_write(fileno(to), chunk, st.st_size);
if (munmap(chunk, st.st_size) < 0)
warn ("munmap");
sec_fflush(to); sec_fflush(to);
return st.st_size; return res;
} }
} }
#endif #endif
while((n = read(fileno(from), buf, sizeof(buf))) > 0){ buf = alloc_buffer (buf, &bufsize,
fstat(fileno(from), &st) >= 0 ? &st : NULL);
if (buf == NULL)
return -1;
while((n = read(fileno(from), buf, bufsize)) > 0){
werr = sec_write(fileno(to), buf, n); werr = sec_write(fileno(to), buf, n);
if(werr < 0) if(werr < 0)
break; break;
@@ -826,7 +867,7 @@ recvrequest(char *cmd, char *local, char *remote, char *lmode, int printnames)
int (*closefunc) (FILE *); int (*closefunc) (FILE *);
sighand oldintr, oldintp; sighand oldintr, oldintp;
int c, d, is_retr, tcrflag, bare_lfs = 0; int c, d, is_retr, tcrflag, bare_lfs = 0;
static int bufsize; static size_t bufsize;
static char *buf; static char *buf;
long bytes = 0, hashbytes = HASHBYTES; long bytes = 0, hashbytes = HASHBYTES;
struct timeval start, stop; struct timeval start, stop;
@@ -951,24 +992,11 @@ recvrequest(char *cmd, char *local, char *remote, char *lmode, int printnames)
} }
closefunc = fclose; closefunc = fclose;
} }
{ buf = alloc_buffer (buf, &bufsize,
size_t blocksize = BUFSIZ; fstat(fileno(fout), &st) >= 0 ? &st : NULL);
#ifdef HAVE_ST_BLKSIZE if (buf == NULL)
if (fstat(fileno(fout), &st) >= 0 && st.st_blksize > 0)
blocksize = st.st_blksize;
#endif
if (blocksize > bufsize) {
if (buf)
free(buf);
buf = malloc(blocksize);
if (buf == NULL) {
warn("malloc");
bufsize = 0;
goto abort; goto abort;
}
bufsize = blocksize;
}
}
gettimeofday(&start, (struct timezone *)0); gettimeofday(&start, (struct timezone *)0);
switch (curtype) { switch (curtype) {