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
/*
* 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
copy_stream(FILE *from, FILE *to)
{
char buf[BUFSIZ];
static size_t bufsize;
static char *buf;
int n;
int bytes = 0;
int werr;
int hashbytes = HASHBYTES;
struct stat st;
#ifdef HAVE_MMAP
struct stat st;
void *chunk;
#ifndef MAP_FAILED
#define MAP_FAILED (-1)
#endif
if(fstat(fileno(from), &st) == 0 && S_ISREG(st.st_mode)){
chunk = mmap(0, st.st_size, PROT_READ, MAP_SHARED, fileno(from), 0);
if(chunk != NULL){
sec_write(fileno(to), chunk, st.st_size);
munmap(chunk, st.st_size);
if (chunk != (void *)MAP_FAILED) {
int res;
res = sec_write(fileno(to), chunk, st.st_size);
if (munmap(chunk, st.st_size) < 0)
warn ("munmap");
sec_fflush(to);
return st.st_size;
return res;
}
}
#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);
if(werr < 0)
break;
@@ -826,7 +867,7 @@ recvrequest(char *cmd, char *local, char *remote, char *lmode, int printnames)
int (*closefunc) (FILE *);
sighand oldintr, oldintp;
int c, d, is_retr, tcrflag, bare_lfs = 0;
static int bufsize;
static size_t bufsize;
static char *buf;
long bytes = 0, hashbytes = HASHBYTES;
struct timeval start, stop;
@@ -951,24 +992,11 @@ recvrequest(char *cmd, char *local, char *remote, char *lmode, int printnames)
}
closefunc = fclose;
}
{
size_t blocksize = BUFSIZ;
#ifdef HAVE_ST_BLKSIZE
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;
}
bufsize = blocksize;
}
}
buf = alloc_buffer (buf, &bufsize,
fstat(fileno(fout), &st) >= 0 ? &st : NULL);
if (buf == NULL)
goto abort;
gettimeofday(&start, (struct timezone *)0);
switch (curtype) {