From Andre.Albsmeier@siemens.com  Tue Jun 12 07:39:11 2012
Return-Path: <Andre.Albsmeier@siemens.com>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 1103D106564A
	for <FreeBSD-gnats-submit@freebsd.org>; Tue, 12 Jun 2012 07:39:11 +0000 (UTC)
	(envelope-from Andre.Albsmeier@siemens.com)
Received: from david.siemens.de (david.siemens.de [192.35.17.14])
	by mx1.freebsd.org (Postfix) with ESMTP id 7BD338FC0A
	for <FreeBSD-gnats-submit@freebsd.org>; Tue, 12 Jun 2012 07:39:10 +0000 (UTC)
Received: from mail2.siemens.de (localhost [127.0.0.1])
	by david.siemens.de (8.13.6/8.13.6) with ESMTP id q5C7VCfx027630
	for <FreeBSD-gnats-submit@freebsd.org>; Tue, 12 Jun 2012 09:31:12 +0200
Received: from curry.mchp.siemens.de (curry.mchp.siemens.de [139.25.40.130])
	by mail2.siemens.de (8.13.6/8.13.6) with ESMTP id q5C7VCmq031180
	for <FreeBSD-gnats-submit@freebsd.org>; Tue, 12 Jun 2012 09:31:12 +0200
Received: (from localhost)
	by curry.mchp.siemens.de (8.14.5/8.14.5) id q5C7VCMi082581
	for FreeBSD-gnats-submit@freebsd.org; Tue, 12 Jun 2012 09:31:12 +0200 (CEST)
Message-Id: <201206120731.q5C7VCvl023161@curry.mchp.siemens.de>
Date: Tue, 12 Jun 2012 09:31:12 +0200 (CEST)
From: Andre Albsmeier <Andre.Albsmeier@siemens.com>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [PATCH] for rdist6 to handle files > 2GB
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         168972
>Category:       ports
>Synopsis:       [PATCH] for net/rdist6 to handle files > 2GB
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    scheidell
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jun 12 07:40:14 UTC 2012
>Closed-Date:    Tue Jul 03 18:06:31 UTC 2012
>Last-Modified:  Tue Jul  3 18:10:08 UTC 2012
>Originator:     Andre Albsmeier
>Release:        FreeBSD 7.4-STABLE i386
>Organization:
>Environment:

System: FreeBSD 7.4-STABLE FreeBSD
using rdist6 and files > 2GB

>Description:

net/rdist6 fails on files > 2GB

>How-To-Repeat:

Install net/rdist6 and try to use it with files > 2GB

>Fix:

The patch implements what OpenBSD did in their base tree
plus some changes to make it work with the port.

--- ./src/rdist.c.ORI	2012-06-12 07:35:16.000000000 +0200
+++ ./src/rdist.c	2012-06-12 07:49:18.000000000 +0200
@@ -62,8 +62,8 @@
 char   	       *distfile = NULL;		/* Name of distfile to use */
 int     	maxchildren = MAXCHILDREN;	/* Max no of concurrent PIDs */
 int		nflag = 0;			/* Say without doing */
-long		min_freespace = 0;		/* Min filesys free space */
-long		min_freefiles = 0;		/* Min filesys free # files */
+int64_t		min_freespace = 0;		/* Min filesys free space */
+int64_t		min_freefiles = 0;		/* Min filesys free # files */
 FILE   	       *fin = NULL;			/* Input file pointer */
 struct group   *gr = NULL;			/* Static area for getgrent */
 char		localmsglist[] = "stdout=all:notify=all:syslog=nerror,ferror";
@@ -109,6 +109,7 @@
 	register char *cp;
 	int cmdargs = 0;
 	int c;
+	const char *errstr;
 
 	/*
 	 * We initialize progname here instead of init() because
@@ -178,10 +179,20 @@
 				error("\"%s\" is not a number.", optarg);
 				usage();
 			}
-			if (c == 'a')
-				min_freespace = atoi(optarg);
-			else if (c == 'A')
-				min_freefiles = atoi(optarg);
+			if (c == 'a') {
+				min_freespace = (int64_t)strtonum(optarg,
+					0, LLONG_MAX, &errstr);
+				if (errstr)
+					fatalerr("Minimum free space is %s: "
+						 "'%s'", errstr, optarg);
+			}
+			else if (c == 'A') {
+				min_freefiles = (int64_t)strtonum(optarg,
+					0, LLONG_MAX, &errstr);
+				if (errstr)
+					fatalerr("Minimum free files is %s: "
+						 "'%s'", errstr, optarg);
+			}
 			else if (c == 'M')
 				maxchildren = atoi(optarg);
 			else if (c == 't')
--- ./src/server.c.ORI	2012-06-12 07:35:16.000000000 +0200
+++ ./src/server.c	2012-06-12 08:14:41.651950502 +0200
@@ -62,8 +62,8 @@
 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 @@
 	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), 
@@ -783,13 +783,13 @@
 	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) {
@@ -1306,6 +1306,7 @@
 {
 	register char *cp = cmd;
 	char *estr;
+	const char *errstr;
 
 	switch (*cp++) {
 	case SC_HOSTNAME:	/* Set hostname */
@@ -1322,19 +1323,15 @@
 		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 +1361,7 @@
 	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 +1385,7 @@
 	/*
 	 * 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 +1394,7 @@
 	/*
 	 * 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 +1438,8 @@
 	}
 
 	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 +1483,7 @@
 	 */
 	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 +1495,15 @@
 		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;
 		}
 	}
--- ./src/docmd.c.ORI	2012-06-12 07:35:16.000000000 +0200
+++ ./src/docmd.c	2012-06-12 08:11:29.000000000 +0200
@@ -102,7 +102,8 @@
 	register struct namelist *to;
 	time_t lmod;
 {
-	register int fd, len;
+	register int fd;
+	ssize_t len;
 	FILE *pf, *popen();
 	struct stat stb;
 	static char buf[BUFSIZ];
@@ -325,7 +326,7 @@
 	register char *ruser, *cp;
 	static char *cur_host = NULL;
 	extern char *locuser;
-	extern long min_freefiles, min_freespace;
+	extern int64_t min_freefiles, min_freespace;
 	extern char *remotemsglist;
 	char tuser[BUFSIZ], buf[BUFSIZ];
 	u_char respbuff[BUFSIZ];
@@ -416,13 +417,13 @@
 			return(0);
 	}
 	if (min_freespace) {
-		(void) sendcmd(C_SETCONFIG, "%c%d", SC_FREESPACE, 
+		(void) sendcmd(C_SETCONFIG, "%c%lld", SC_FREESPACE, 
 			       min_freespace);
 		if (response() < 0)
 			return(0);
 	}
 	if (min_freefiles) {
-		(void) sendcmd(C_SETCONFIG, "%c%d", SC_FREEFILES, 
+		(void) sendcmd(C_SETCONFIG, "%c%lld", SC_FREEFILES, 
 			       min_freefiles);
 		if (response() < 0)
 			return(0);
--- ./src/common.c.ORI	2012-06-12 07:35:16.000000000 +0200
+++ ./src/common.c	2012-06-12 08:01:34.000000000 +0200
@@ -379,14 +379,14 @@
  */
 static u_char rembuf[BUFSIZ];
 static u_char *remptr;
-static int remleft;
+static ssize_t remleft;
 
 #define remc() (--remleft < 0 ? remmore() : *remptr++)
 
 /*
  * Back end to remote read()
  */
-static int remread(fd, buf, bufsiz)
+static ssize_t remread(fd, buf, bufsiz)
 	int fd;
 	u_char *buf;
 	int bufsiz;
@@ -480,7 +480,7 @@
 /*
  * Non-line-oriented remote read.
  */
-readrem(p, space)
+ssize_t readrem(p, space)
 	char *p;
 	register int space;
 {
@@ -878,7 +878,7 @@
 	extern POINTER *malloc();
 
 	if ((ptr = (char *)malloc(amt)) == NULL)
-		fatalerr("Cannot malloc %d bytes of memory.", amt);
+		fatalerr("Cannot malloc %zu bytes of memory.", amt);
 
 	return(ptr);
 }
@@ -894,7 +894,7 @@
 	extern POINTER *realloc();
 
 	if ((new = (char *)realloc(baseptr, amt)) == NULL)
-		fatalerr("Cannot realloc %d bytes of memory.", amt);
+		fatalerr("Cannot realloc %zu bytes of memory.", amt);
 
 	return(new);
 }
@@ -910,7 +910,7 @@
 	extern POINTER *calloc();
 
 	if ((ptr = (char *)calloc(num, esize)) == NULL)
-		fatalerr("Cannot calloc %d * %d = %d bytes of memory.",
+		fatalerr("Cannot calloc %zu * %zu = %zu bytes of memory.",
 		      num, esize, num * esize);
 
 	return(ptr);
--- ./src/filesys.c.ORI	2012-06-12 07:35:16.000000000 +0200
+++ ./src/filesys.c	2012-06-12 08:12:20.000000000 +0200
@@ -434,8 +434,8 @@
  */
 int getfilesysinfo(file, freespace, freefiles)
 	char *file;
-	long *freespace;
-	long *freefiles;
+	int64_t *freespace;
+	int64_t *freefiles;
 {
 #if	defined(STATFS_TYPE)
 	static statfs_t statfsbuf;
--- ./config/config-data.h.ORI	1998-11-10 04:59:47.000000000 +0100
+++ ./config/config-data.h	2012-06-12 07:55:48.000000000 +0200
@@ -58,10 +58,10 @@
  * Set default write(2) return and amount types.
  */
 #if	!defined(WRITE_RETURN_T)
-#define		WRITE_RETURN_T		int	/* What write() returns */
+#define		WRITE_RETURN_T		ssize_t	/* What write() returns */
 #endif	/* WRITE_RETURN_T */
 #if	!defined(WRITE_AMT_T)
-#define		WRITE_AMT_T		int	/* Amount to write */
+#define		WRITE_AMT_T		size_t	/* Amount to write */
 #endif	/* WRITE_AMT_T */
 
 #endif	/* __configdata_h__ */
--- ./src/client.c.ORI	2012-06-12 08:26:35.000000000 +0200
+++ ./src/client.c	2012-06-12 08:57:34.000000000 +0200
@@ -399,9 +399,9 @@
 	/*
 	 * Send file info
 	 */
-	(void) sendcmd(C_RECVREG, "%o %04o %ld %ld %ld %s %s %s", 
+	(void) sendcmd(C_RECVREG, "%o %04o %lld %ld %ld %s %s %s", 
 		       opts, stb->st_mode & 07777, 
-		       (long) stb->st_size, 
+		       (long long) stb->st_size, 
 		       stb->st_mtime, stb->st_atime,
 		       user, group, rname);
 	if (response() < 0) {
@@ -409,8 +409,8 @@
 		return(-1);
 	}
 
-	debugmsg(DM_MISC, "Send file '%s' %d bytes\n", 
-		 rname, (long) stb->st_size);
+	debugmsg(DM_MISC, "Send file '%s' %ld bytes\n", 
+		 rname, (long long) stb->st_size);
 
 	/*
 	 * Set remote time out alarm handler.
@@ -661,9 +661,9 @@
 	/*
 	 * Gather and send basic link info
 	 */
-	(void) sendcmd(C_RECVSYMLINK, "%o %04o %ld %ld %ld %s %s %s", 
+	(void) sendcmd(C_RECVSYMLINK, "%o %04o %lld %ld %ld %s %s %s", 
 		       opts, stb->st_mode & 07777, 
-		       (long) stb->st_size, 
+		       (long long) stb->st_size, 
 		       stb->st_mtime, stb->st_atime,
 		       user, group, rname);
 	if (response() < 0)
@@ -843,7 +843,7 @@
 	/*
 	 * Parse size
 	 */
-	size = strtol(cp, &cp, 10);
+	size = strtoll(cp, &cp, 10);
 	if (*cp++ != ' ') {
 		error("update: size not delimited");
 		return(US_NOTHING);
@@ -895,8 +895,8 @@
 
 	debugmsg(DM_MISC, "update(%s,) local mode %04o remote mode %04o\n", 
 		 rname, lmode, rmode);
-	debugmsg(DM_MISC, "update(%s,) size %d mtime %d owner '%s' grp '%s'\n",
-		 rname, (int) size, mtime, owner, group);
+	debugmsg(DM_MISC, "update(%s,) size %lld mtime %d owner '%s' grp '%s'\n",
+		 rname, (long long) size, mtime, owner, group);
 
 	if (statp->st_mtime != mtime) {
 		if (statp->st_mtime < mtime && IS_ON(opts, DO_YOUNGER)) {
@@ -922,8 +922,8 @@
 	}
 
 	if (statp->st_size != size) {
-		debugmsg(DM_MISC, "size does not match (%d != %d).\n",
-			 (int) statp->st_size, size);
+		debugmsg(DM_MISC, "size does not match (%lld != %lld).\n",
+			 (long long) statp->st_size, (long long)size);
 		return(US_OUTDATE);
 	} 
 
--- ./src/child.c.ORI	1998-11-10 05:18:57.000000000 +0100
+++ ./src/child.c	2012-06-12 08:58:16.000000000 +0200
@@ -189,7 +189,7 @@
 	CHILD *child;
 {
 	char rbuf[BUFSIZ];
-	int amt;
+	ssize_t amt;
 
 	debugmsg(DM_CALL, "[readchild(%s, %d, %d) start]", 
 		 child->c_name, child->c_pid, child->c_readfd);
@@ -208,7 +208,7 @@
 	 */
 	while ((amt = read(child->c_readfd, rbuf, sizeof(rbuf))) > 0) {
 		/* XXX remove these debug calls */
-		debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %d bytes]", 
+		debugmsg(DM_MISC, "[readchild(%s, %d, %d) got %lld bytes]", 
 			 child->c_name, child->c_pid, child->c_readfd, amt);
 
 		(void) xwrite(fileno(stdout), rbuf, amt);
@@ -217,7 +217,7 @@
 			 child->c_name, child->c_pid, child->c_readfd);
 	}
 
-	debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %d errno = %d\n",
+	debugmsg(DM_MISC, "readchild(%s, %d, %d) done: amt = %lld errno = %d\n",
 		 child->c_name, child->c_pid, child->c_readfd, amt, errno);
 
 	/* 

>Release-Note:
>Audit-Trail:

From: Michael Scheidell <scheidell@FreeBSD.org>
To: <bug-followup@FreeBSD.org>
Cc:  
Subject: Re: ports/168972: [PATCH] for net/rdist6 to handle files &gt; 2GB
Date: Sat, 16 Jun 2012 09:40:20 -0400

 Committer: you might want to take this pr also since it deals with rdist6
 
 ports/169138 <http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/169138>
 
 -- 
 Michael Scheidell, CTO
  >*| * SECNAP Network Security Corporation
 d: +1.561.948.2259
 w: http://people.freebsd.org/~scheidell
Responsible-Changed-From-To: freebsd-ports-bugs->scheidell 
Responsible-Changed-By: scheidell 
Responsible-Changed-When: Tue Jul 3 17:58:07 UTC 2012 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=168972 
State-Changed-From-To: open->closed 
State-Changed-By: scheidell 
State-Changed-When: Tue Jul 3 18:06:30 UTC 2012 
State-Changed-Why:  
Committed, with minor changes. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=168972 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/168972: commit references a PR
Date: Tue,  3 Jul 2012 18:06:10 +0000 (UTC)

 scheidell    2012-07-03 18:06:01 UTC
 
   FreeBSD ports repository
 
   Modified files:
     net/rdist6           Makefile 
   Added files:
     net/rdist6/files     patch-rdist.c 
   Log:
   - Patch to handle files > 2GB
   - Bump PORTREVISION
   
   PR:             ports/168972
   Submitted by:   Andre Albsmeier <Andre.Albsmeier@siemens.com>
   
   Revision  Changes    Path
   1.29      +1 -1      ports/net/rdist6/Makefile
   1.1       +404 -0    ports/net/rdist6/files/patch-rdist.c (new)
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
>Unformatted:
