version 1.21, 2009/10/27 23:59:42 |
version 1.22, 2011/04/10 15:47:28 |
|
|
int catname = 0; /* cat name to target name */ |
int catname = 0; /* cat name to target name */ |
char *sptarget[32]; /* stack of saved ptarget's for directories */ |
char *sptarget[32]; /* stack of saved ptarget's for directories */ |
char *fromhost = NULL; /* Client hostname */ |
char *fromhost = NULL; /* Client hostname */ |
static long min_freespace = 0; /* Minimium free space on a filesystem */ |
static int64_t min_freespace = 0; /* Minimium free space on a filesystem */ |
static long min_freefiles = 0; /* Minimium free # files on a filesystem */ |
static int64_t min_freefiles = 0; /* Minimium free # files on a filesystem */ |
int oumask; /* Old umask */ |
int oumask; /* Old umask */ |
|
|
static int cattarget(char *); |
static int cattarget(char *); |
|
|
case S_IFIFO: |
case S_IFIFO: |
#endif |
#endif |
#endif |
#endif |
(void) sendcmd(QC_YES, "%ld %ld %o %s %s", |
(void) sendcmd(QC_YES, "%lld %ld %o %s %s", |
(long) stb.st_size, stb.st_mtime, |
(long long) stb.st_size, stb.st_mtime, |
stb.st_mode & 07777, |
stb.st_mode & 07777, |
getusername(stb.st_uid, target, options), |
getusername(stb.st_uid, target, options), |
getgroupname(stb.st_gid, target, options)); |
getgroupname(stb.st_gid, target, options)); |
|
|
wrerr = 0; |
wrerr = 0; |
olderrno = 0; |
olderrno = 0; |
for (i = 0; i < size; i += BUFSIZ) { |
for (i = 0; i < size; i += BUFSIZ) { |
int amt = BUFSIZ; |
off_t amt = BUFSIZ; |
|
|
cp = buf; |
cp = buf; |
if (i + amt > size) |
if (i + amt > size) |
amt = size - i; |
amt = size - i; |
do { |
do { |
int j; |
ssize_t j; |
|
|
j = readrem(cp, amt); |
j = readrem(cp, amt); |
if (j <= 0) { |
if (j <= 0) { |
|
|
{ |
{ |
char *cp = cmd; |
char *cp = cmd; |
char *estr; |
char *estr; |
|
const char *errstr; |
|
|
switch (*cp++) { |
switch (*cp++) { |
case SC_HOSTNAME: /* Set hostname */ |
case SC_HOSTNAME: /* Set hostname */ |
|
|
break; |
break; |
|
|
case SC_FREESPACE: /* Minimium free space */ |
case SC_FREESPACE: /* Minimium free space */ |
if (!isdigit((unsigned char)*cp)) { |
min_freespace = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr); |
fatalerr("Expected digit, got '%s'.", cp); |
if (errstr) |
return; |
fatalerr("Minimum free space is %s: '%s'", errstr, |
} |
optarg); |
min_freespace = (unsigned long) atoi(cp); |
|
break; |
break; |
|
|
case SC_FREEFILES: /* Minimium free files */ |
case SC_FREEFILES: /* Minimium free files */ |
if (!isdigit((unsigned char)*cp)) { |
min_freefiles = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr); |
fatalerr("Expected digit, got '%s'.", cp); |
if (errstr) |
return; |
fatalerr("Minimum free files is %s: '%s'", errstr, |
} |
optarg); |
min_freefiles = (unsigned long) atoi(cp); |
|
break; |
break; |
|
|
case SC_LOGGING: /* Logging options */ |
case SC_LOGGING: /* Logging options */ |
|
|
char *owner, *group, *file; |
char *owner, *group, *file; |
char new[MAXPATHLEN]; |
char new[MAXPATHLEN]; |
char fileb[MAXPATHLEN]; |
char fileb[MAXPATHLEN]; |
long freespace = -1, freefiles = -1; |
int64_t freespace = -1, freefiles = -1; |
char *cp = cmd; |
char *cp = cmd; |
|
|
/* |
/* |
|
|
/* |
/* |
* Get file size |
* Get file size |
*/ |
*/ |
size = strtol(cp, &cp, 10); |
size = (off_t) strtoll(cp, &cp, 10); |
if (*cp++ != ' ') { |
if (*cp++ != ' ') { |
error("recvit: size not delimited"); |
error("recvit: size not delimited"); |
return; |
return; |
|
|
/* |
/* |
* Get modification time |
* Get modification time |
*/ |
*/ |
mtime = strtol(cp, &cp, 10); |
mtime = (time_t) strtol(cp, &cp, 10); |
if (*cp++ != ' ') { |
if (*cp++ != ' ') { |
error("recvit: mtime not delimited"); |
error("recvit: mtime not delimited"); |
return; |
return; |
|
|
file = fileb; |
file = fileb; |
|
|
debugmsg(DM_MISC, |
debugmsg(DM_MISC, |
"recvit: opts = %04o mode = %04o size = %d mtime = %d", |
"recvit: opts = %04o mode = %04o size = %lld mtime = %d", |
opts, mode, size, mtime); |
opts, mode, (long long) size, mtime); |
debugmsg(DM_MISC, |
debugmsg(DM_MISC, |
"recvit: owner = '%s' group = '%s' file = '%s' catname = %d isdir = %d", |
"recvit: owner = '%s' group = '%s' file = '%s' catname = %d isdir = %d", |
owner, group, file, catname, (type == S_IFDIR) ? 1 : 0); |
owner, group, file, catname, (type == S_IFDIR) ? 1 : 0); |
|
|
*/ |
*/ |
if (min_freespace || min_freefiles) { |
if (min_freespace || min_freefiles) { |
/* Convert file size to kilobytes */ |
/* Convert file size to kilobytes */ |
long fsize = (long) (size / 1024); |
int64_t fsize = (int64_t)size / 1024; |
|
|
if (getfilesysinfo(target, &freespace, &freefiles) != 0) |
if (getfilesysinfo(target, &freespace, &freefiles) != 0) |
return; |
return; |
|
|
if (min_freespace && (freespace >= 0) && |
if (min_freespace && (freespace >= 0) && |
(freespace - fsize < min_freespace)) { |
(freespace - fsize < min_freespace)) { |
error( |
error( |
"%s: Not enough free space on filesystem: min %d free %d", |
"%s: Not enough free space on filesystem: min %lld " |
target, min_freespace, freespace); |
"free %lld", target, min_freespace, freespace); |
return; |
return; |
} |
} |
if (min_freefiles && (freefiles >= 0) && |
if (min_freefiles && (freefiles >= 0) && |
(freefiles - 1 < min_freefiles)) { |
(freefiles - 1 < min_freefiles)) { |
error( |
error( |
"%s: Not enough free files on filesystem: min %d free %d", |
"%s: Not enough free files on filesystem: min %lld free " |
target, min_freefiles, freefiles); |
"%lld", target, min_freefiles, freefiles); |
return; |
return; |
} |
} |
} |
} |