200 lines
5.8 KiB
C
200 lines
5.8 KiB
C
--- src/server.c.orig 1998-11-10 04:15:31 UTC
|
|
+++ src/server.c
|
|
@@ -62,8 +62,8 @@ char *ptarget; /* pointer to end of target name */
|
|
int catname = 0; /* cat name to target name */
|
|
char *sptarget[32]; /* stack of saved ptarget's for directories */
|
|
char *fromhost = NULL; /* Client hostname */
|
|
-static long min_freespace = 0; /* Minimium free space on a filesystem */
|
|
-static long min_freefiles = 0; /* Minimium free # files on a filesystem */
|
|
+static int64_t min_freespace = 0; /* Minimium free space on a filesystem */
|
|
+static int64_t min_freefiles = 0; /* Minimium free # files on a filesystem */
|
|
int oumask; /* Old umask */
|
|
|
|
/*
|
|
@@ -645,8 +645,8 @@ static void query(name)
|
|
case S_IFLNK:
|
|
case S_IFDIR:
|
|
case S_IFREG:
|
|
- (void) sendcmd(QC_YES, "%ld %ld %o %s %s",
|
|
- (long) stb.st_size,
|
|
+ (void) sendcmd(QC_YES, "%lld %ld %o %s %s",
|
|
+ (long long) stb.st_size,
|
|
stb.st_mtime,
|
|
stb.st_mode & 07777,
|
|
getusername(stb.st_uid, target, options),
|
|
@@ -767,9 +767,9 @@ static void recvfile(new, opts, mode, owner, group, mt
|
|
/*
|
|
* Create temporary file
|
|
*/
|
|
- if ((f = creat(new, mode)) < 0) {
|
|
+ if ((f = open(new, O_CREAT|O_TRUNC|O_WRONLY|O_EXCL, mode)) < 0) {
|
|
if (errno != ENOENT || chkparent(new, opts) < 0 ||
|
|
- (f = creat(new, mode)) < 0) {
|
|
+ (f = open(new, O_CREAT|O_TRUNC|O_WRONLY|O_EXCL, mode)) < 0) {
|
|
error("%s: create failed: %s", new, SYSERR);
|
|
(void) unlink(new);
|
|
return;
|
|
@@ -783,13 +783,13 @@ static void recvfile(new, opts, mode, owner, group, mt
|
|
wrerr = 0;
|
|
olderrno = 0;
|
|
for (i = 0; i < size; i += BUFSIZ) {
|
|
- int amt = BUFSIZ;
|
|
+ off_t amt = BUFSIZ;
|
|
|
|
cp = buf;
|
|
if (i + amt > size)
|
|
amt = size - i;
|
|
do {
|
|
- int j;
|
|
+ ssize_t j;
|
|
|
|
j = readrem(cp, amt);
|
|
if (j <= 0) {
|
|
@@ -1245,18 +1245,35 @@ static void hardlink(cmd)
|
|
return;
|
|
}
|
|
|
|
- oldname = strtok(cp, " ");
|
|
- if (oldname == NULL) {
|
|
- error("hardlink: oldname name not delimited");
|
|
- return;
|
|
- }
|
|
+{ unsigned int len;
|
|
|
|
- newname = strtok((char *)NULL, " ");
|
|
- if (newname == NULL) {
|
|
- error("hardlink: new name not specified");
|
|
- return;
|
|
- }
|
|
+ if( *( cp += strspn( cp, " " ) ) == '\0' ) {
|
|
+ error("hardlink: oldnamelen name not found");
|
|
+ return;
|
|
+ }
|
|
|
|
+ len = strtoul( cp, &cp, 10 );
|
|
+
|
|
+ if( *( cp += strspn( cp, " " ) ) == '\0' ) {
|
|
+ error("hardlink: oldname not found");
|
|
+ return;
|
|
+ }
|
|
+ oldname = cp;
|
|
+ if( strlen( cp ) < len + 2 ) {
|
|
+ error("hardlink: oldname too short or nothing following found");
|
|
+ return;
|
|
+ }
|
|
+ cp += len;
|
|
+ *cp++ = '\0';
|
|
+
|
|
+ if( *( cp += strspn( cp, " " ) ) == '\0' ) {
|
|
+ error("hardlink: newname not found");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ newname = cp;
|
|
+}
|
|
+
|
|
if (exptilde(expbuf, oldname) == NULL) {
|
|
error("hardlink: tilde expansion failed");
|
|
return;
|
|
@@ -1306,6 +1323,7 @@ static void setconfig(cmd)
|
|
{
|
|
register char *cp = cmd;
|
|
char *estr;
|
|
+ const char *errstr;
|
|
|
|
switch (*cp++) {
|
|
case SC_HOSTNAME: /* Set hostname */
|
|
@@ -1322,19 +1340,15 @@ static void setconfig(cmd)
|
|
break;
|
|
|
|
case SC_FREESPACE: /* Minimium free space */
|
|
- if (!isdigit(*cp)) {
|
|
- fatalerr("Expected digit, got '%s'.", cp);
|
|
- return;
|
|
- }
|
|
- min_freespace = (unsigned long) atoi(cp);
|
|
+ min_freespace = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr);
|
|
+ if (errstr)
|
|
+ fatalerr("Minimum free space is %s: '%s'", errstr, optarg);
|
|
break;
|
|
|
|
case SC_FREEFILES: /* Minimium free files */
|
|
- if (!isdigit(*cp)) {
|
|
- fatalerr("Expected digit, got '%s'.", cp);
|
|
- return;
|
|
- }
|
|
- min_freefiles = (unsigned long) atoi(cp);
|
|
+ min_freefiles = (int64_t)strtonum(cp, 0, LLONG_MAX, &errstr);
|
|
+ if (errstr)
|
|
+ fatalerr("Minimum free files is %s: '%s'", errstr, optarg);
|
|
break;
|
|
|
|
case SC_LOGGING: /* Logging options */
|
|
@@ -1364,7 +1378,7 @@ static void recvit(cmd, type)
|
|
time_t mtime, atime;
|
|
char *owner, *group, *file;
|
|
char new[MAXPATHLEN];
|
|
- long freespace = -1, freefiles = -1;
|
|
+ int64_t freespace = -1, freefiles = -1;
|
|
char *cp = cmd;
|
|
|
|
/*
|
|
@@ -1388,7 +1402,7 @@ static void recvit(cmd, type)
|
|
/*
|
|
* Get file size
|
|
*/
|
|
- size = strtol(cp, &cp, 10);
|
|
+ size = (off_t) strtoll(cp, &cp, 10);
|
|
if (*cp++ != ' ') {
|
|
error("recvit: size not delimited");
|
|
return;
|
|
@@ -1397,7 +1411,7 @@ static void recvit(cmd, type)
|
|
/*
|
|
* Get modification time
|
|
*/
|
|
- mtime = strtol(cp, &cp, 10);
|
|
+ mtime = (time_t) strtol(cp, &cp, 10);
|
|
if (*cp++ != ' ') {
|
|
error("recvit: mtime not delimited");
|
|
return;
|
|
@@ -1441,8 +1455,8 @@ static void recvit(cmd, type)
|
|
}
|
|
|
|
debugmsg(DM_MISC,
|
|
- "recvit: opts = %04o mode = %04o size = %d mtime = %d",
|
|
- opts, mode, size, mtime);
|
|
+ "recvit: opts = %04o mode = %04o size = %lld mtime = %d",
|
|
+ opts, mode, (long long) size, mtime);
|
|
debugmsg(DM_MISC,
|
|
"recvit: owner = '%s' group = '%s' file = '%s' catname = %d isdir = %d",
|
|
owner, group, file, catname, (type == S_IFDIR) ? 1 : 0);
|
|
@@ -1486,7 +1500,7 @@ static void recvit(cmd, type)
|
|
*/
|
|
if (min_freespace || min_freefiles) {
|
|
/* Convert file size to kilobytes */
|
|
- long fsize = (long) (size / 1024);
|
|
+ int64_t fsize = (int64_t)size / 1024;
|
|
|
|
if (getfilesysinfo(target, &freespace, &freefiles) != 0)
|
|
return;
|
|
@@ -1498,15 +1512,15 @@ static void recvit(cmd, type)
|
|
if (min_freespace && (freespace >= 0) &&
|
|
(freespace - fsize < min_freespace)) {
|
|
error(
|
|
- "%s: Not enough free space on filesystem: min %d free %d",
|
|
- target, min_freespace, freespace);
|
|
+ "%s: Not enough free space on filesystem: min %lld "
|
|
+ "free %lld", target, min_freespace, freespace);
|
|
return;
|
|
}
|
|
if (min_freefiles && (freefiles >= 0) &&
|
|
(freefiles - 1 < min_freefiles)) {
|
|
error(
|
|
- "%s: Not enough free files on filesystem: min %d free %d",
|
|
- target, min_freefiles, freefiles);
|
|
+ "%s: Not enough free files on filesystem: min %lld free "
|
|
+ "%lld", target, min_freefiles, freefiles);
|
|
return;
|
|
}
|
|
}
|