version 1.18, 2008/05/13 02:13:46 |
version 1.19, 2008/05/25 22:33:56 |
|
|
static void query(char *); |
static void query(char *); |
static int chkparent(char *, opt_t); |
static int chkparent(char *, opt_t); |
static char *savetarget(char *, opt_t); |
static char *savetarget(char *, opt_t); |
static void recvfile(char *, int, opt_t, int, char *, char *, time_t, time_t, off_t); |
static void recvfile(char *, opt_t, int, char *, char *, time_t, time_t, off_t); |
static void recvdir(opt_t, int, char *, char *); |
static void recvdir(opt_t, int, char *, char *); |
static void recvlink(char *, opt_t, int, off_t); |
static void recvlink(char *, opt_t, int, off_t); |
static void hardlink(char *); |
static void hardlink(char *); |
|
|
* Receive a file |
* Receive a file |
*/ |
*/ |
static void |
static void |
recvfile(char *new, int f, opt_t opts, int mode, char *owner, |
recvfile(char *new, opt_t opts, int mode, char *owner, char *group, |
char *group, time_t mtime, time_t atime, off_t size) |
time_t mtime, time_t atime, off_t size) |
{ |
{ |
int wrerr, olderrno; |
int f, wrerr, olderrno; |
off_t i; |
off_t i; |
char *cp; |
char *cp; |
char *savefile = NULL; |
char *savefile = NULL; |
static struct stat statbuff; |
static struct stat statbuff; |
|
|
/* |
/* |
|
* Create temporary file |
|
*/ |
|
if ((f = mkstemp(new)) < 0) { |
|
if (errno != ENOENT || chkparent(new, opts) < 0 || |
|
(f = mkstemp(new)) < 0) { |
|
error("%s: create failed: %s", new, SYSERR); |
|
return; |
|
} |
|
} |
|
|
|
/* |
* Receive the file itself |
* Receive the file itself |
*/ |
*/ |
ack(); |
ack(); |
|
|
/* |
/* |
* Make new symlink using a temporary name |
* Make new symlink using a temporary name |
*/ |
*/ |
if (symlink(buf, new) < 0) { |
if (mktemp(new) == NULL || symlink(buf, new) < 0) { |
if (errno != ENOENT || chkparent(new, opts) < 0 || |
if (errno != ENOENT || chkparent(new, opts) < 0 || |
symlink(buf, new) < 0) { |
mktemp(new) == NULL || symlink(buf, new) < 0) { |
error("%s -> %s: symlink failed: %s", new, buf,SYSERR); |
error("%s -> %s: symlink failed: %s", new, buf, SYSERR); |
(void) unlink(new); |
|
return; |
return; |
} |
} |
} |
} |
|
|
static void |
static void |
recvit(char *cmd, int type) |
recvit(char *cmd, int type) |
{ |
{ |
int f, mode; |
int mode; |
opt_t opts; |
opt_t opts; |
off_t size; |
off_t size; |
time_t mtime, atime; |
time_t mtime, atime; |
|
|
tempname); |
tempname); |
*file = '/'; |
*file = '/'; |
} |
} |
if ((f = mkstemp(new)) == -1) { |
|
error("%s: create failed: %s", new, SYSERR); |
|
return; |
|
} |
|
} |
} |
|
|
/* |
/* |
|
|
break; |
break; |
|
|
case S_IFREG: |
case S_IFREG: |
recvfile(new, f, opts, mode, owner, group, mtime, atime, size); |
recvfile(new, opts, mode, owner, group, mtime, atime, size); |
break; |
break; |
|
|
default: |
default: |