3a4e543
* Turn on large file support in gssftp and rcp (and the rest of the bsd
3a4e543
  applications) using AC_SYS_LARGEFILE.
3a4e543
* The size of off_t might now be greater than that of an int or a long, so
3a4e543
  if we have a "long long" type, assume that format specifiers for it work
3a4e543
  correctly and that we can cast off_t values to long long for displaying
3a4e543
  and logging.
3a4e543
* Check for fseeko(), which takes an off_t, and if we find it, use it
3a4e543
  instead of fseek(), which takes a long and might not handle the full
3a4e543
  range of values.
2f5b672
RT#6524
3a4e543
Index: krb5/src/appl/gssftp/configure.in
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/configure.in	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/configure.in	(working copy)
3a4e543
@@ -12,6 +12,9 @@
bee687d
 AC_HEADER_STDARG
bee687d
 AC_CHECK_HEADER(termios.h,[AC_CHECK_FUNC(cfsetispeed,AC_DEFINE(POSIX_TERMIOS,1,[Define if POSIX termios interface found]))])
bee687d
 AC_CHECK_HEADERS(unistd.h stdlib.h string.h sys/select.h sys/sockio.h paths.h)
bee687d
+AC_SYS_LARGEFILE
bee687d
+AC_FUNC_FSEEKO
bee687d
+AC_CHECK_TYPES([long long])
bee687d
 CHECK_UTMP
bee687d
 DECLARE_SYS_ERRLIST
bee687d
 AC_REPLACE_FUNCS(getdtablesize)
3a4e543
Index: krb5/src/appl/gssftp/ftp/ftp_var.h
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/ftp/ftp_var.h	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/ftp/ftp_var.h	(working copy)
3a4e543
@@ -46,13 +46,19 @@
bee687d
 #define FDOPEN_SOCKET(s, mode) fdopen_socket(s, mode)
bee687d
 #define SOCKETNO(fd) _get_osfhandle(fd)
bee687d
 #define PERROR_SOCKET(str) do { errno = SOCKET_ERRNO; perror(str); } while(0)
bee687d
+#define FSEEK(fd, offset, whence) fseek(fd, (long) offset, whence)
bee687d
 #else
bee687d
 #define FCLOSE_SOCKET(f) fclose(f)
bee687d
 FILE* fdopen_socket(int *s, char* mode);
bee687d
 #define FDOPEN_SOCKET(s, mode) fdopen_socket(&s, mode)
bee687d
 #define SOCKETNO(fd) (fd)
bee687d
 #define PERROR_SOCKET(str) perror(str)
bee687d
+#ifdef HAVE_FSEEKO
bee687d
+#define FSEEK(fd, offset, whence) fseeko(fd, (off_t) offset, whence)
bee687d
+#else
bee687d
+#define FSEEK(fd, offset, whence) fseek(fd, (long) offset, whence)
bee687d
 #endif
3a4e543
+#endif
bee687d
 
bee687d
 #ifdef _WIN32
3a4e543
 typedef void (*sig_t)(int);
3a4e543
Index: krb5/src/appl/gssftp/ftp/ftp.c
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/ftp/ftp.c	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/ftp/ftp.c	(working copy)
bee687d
@@ -150,7 +150,11 @@
bee687d
 
bee687d
 static void proxtrans (char *, char *, char *);
bee687d
 static int initconn (void);
bee687d
+#ifdef HAVE_LONG_LONG
bee687d
+static void ptransfer (char *, long long, struct timeval *, struct timeval *);
bee687d
+#else
bee687d
 static void ptransfer (char *, long, struct timeval *, struct timeval *);
bee687d
+#endif
bee687d
 static void abort_remote (FILE *);
bee687d
 static void tvsub (struct timeval *, struct timeval *, struct timeval *);
bee687d
 static char *gunique (char *);
3a4e543
@@ -775,7 +779,11 @@
bee687d
 	FILE *volatile fin, *volatile dout = 0;
bee687d
 	int (*volatile closefunc)();
bee687d
 	volatile sig_t oldintr, oldintp;
bee687d
+#ifdef HAVE_LONG_LONG
bee687d
+	volatile long long bytes = 0, hashbytes = HASHBYTES;
bee687d
+#else
bee687d
 	volatile long bytes = 0, hashbytes = HASHBYTES;
bee687d
+#endif
bee687d
 	char *volatile lmode;
bee687d
 	unsigned char buf[FTP_BUFSIZ], *bufp;
bee687d
 
3a4e543
@@ -872,7 +880,7 @@
bee687d
 
bee687d
 	if (restart_point &&
bee687d
 	    (strcmp(cmd, "STOR") == 0 || strcmp(cmd, "APPE") == 0)) {
bee687d
-		if (fseek(fin, (long) restart_point, 0) < 0) {
bee687d
+		if (FSEEK(fin, restart_point, 0) < 0) {
bee687d
 			fprintf(stderr, "local: %s: %s\n", local,
bee687d
 				strerror(errno));
bee687d
 			restart_point = 0;
3a4e543
@@ -1266,7 +1274,7 @@
bee687d
 		if (restart_point) {
bee687d
 			register int i, n, ch;
bee687d
 
bee687d
-			if (fseek(fout, 0L, L_SET) < 0)
bee687d
+			if (FSEEK(fout, 0L, L_SET) < 0)
bee687d
 				goto done;
bee687d
 			n = restart_point;
bee687d
 			for (i = 0; i++ < n;) {
3a4e543
@@ -1275,7 +1283,7 @@
bee687d
 				if (ch == '\n')
bee687d
 					i++;
bee687d
 			}
bee687d
-			if (fseek(fout, 0L, L_INCR) < 0) {
bee687d
+			if (FSEEK(fout, 0L, L_INCR) < 0) {
bee687d
 done:
bee687d
 				fprintf(stderr, "local: %s: %s\n", local,
bee687d
 					strerror(errno));
3a4e543
@@ -1538,8 +1546,13 @@
bee687d
 	return (FDOPEN_SOCKET(data, lmode));
bee687d
 }
bee687d
 
bee687d
+#ifdef HAVE_LONG_LONG
bee687d
+static void ptransfer(char *direction, long long bytes,
bee687d
+		      struct timeval *t0, struct timeval *t1)
bee687d
+#else
bee687d
 static void ptransfer(char *direction, long bytes,
bee687d
 		      struct timeval *t0, struct timeval *t1)
bee687d
+#endif
bee687d
 {
bee687d
 	struct timeval td;
bee687d
 	float s, kbs;
3a4e543
@@ -1549,8 +1562,13 @@
bee687d
 		s = td.tv_sec + (td.tv_usec / 1000000.);
bee687d
 #define	nz(x)	((x) == 0 ? 1 : (x))
bee687d
 		kbs = (bytes / nz(s))/1024.0;
bee687d
+#ifdef HAVE_LONG_LONG
bee687d
+		printf("%lld bytes %s in %.2g seconds (%.2g Kbytes/s)\n",
bee687d
+		    bytes, direction, s, kbs);
bee687d
+#else
bee687d
 		printf("%ld bytes %s in %.2g seconds (%.2g Kbytes/s)\n",
bee687d
 		    bytes, direction, s, kbs);
bee687d
+#endif
bee687d
 	}
bee687d
 }
bee687d
 
3a4e543
Index: krb5/src/appl/gssftp/ftpd/ftpcmd.y
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/ftpd/ftpcmd.y	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/ftpd/ftpcmd.y	(working copy)
3a4e543
@@ -1497,12 +1497,20 @@
3a4e543
 		    (stbuf.st_mode&S_IFMT) != S_IFREG)
3a4e543
 			reply(550, "%s: not a plain file.", filename);
3a4e543
 		else
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+			reply(213, "%llu", (long long) stbuf.st_size);
3a4e543
+#else
3a4e543
 			reply(213, "%lu", (long) stbuf.st_size);
3a4e543
+#endif
3a4e543
 		break;}
3a4e543
 	case TYPE_A: {
3a4e543
 		FILE *fin;
3a4e543
 		register int c;
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+		register long long count;
3a4e543
+#else
3a4e543
 		register long count;
3a4e543
+#endif
3a4e543
 		struct stat stbuf;
3a4e543
 		fin = fopen(filename, "r");
3a4e543
 		if (fin == NULL) {
3a4e543
@@ -1524,7 +1532,11 @@
3a4e543
 		}
3a4e543
 		(void) fclose(fin);
3a4e543
 
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+		reply(213, "%lld", count);
3a4e543
+#else
3a4e543
 		reply(213, "%ld", count);
3a4e543
+#endif
3a4e543
 		break;}
3a4e543
 	default:
3a4e543
 		reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3a4e543
Index: krb5/src/appl/gssftp/ftpd/ftpd_var.h
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/ftpd/ftpd_var.h	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/ftpd/ftpd_var.h	(working copy)
3a4e543
@@ -41,6 +41,12 @@
3a4e543
 char *radix_error (int);
3a4e543
 int radix_encode (unsigned char *, unsigned char *, int *, int);
3a4e543
 
3a4e543
+#ifdef HAVE_FSEEKO
3a4e543
+#define FSEEK(fd, offset, whence) fseeko(fd, (off_t) offset, whence)
3a4e543
+#else
3a4e543
+#define FSEEK(fd, offset, whence) fseek(fd, (long) offset, whence)
3a4e543
+#endif
3a4e543
+
3a4e543
 /* ftpd.c */
3a4e543
 void ack(char *);
3a4e543
 int auth_data(char *);
3a4e543
Index: krb5/src/appl/gssftp/ftpd/ftpd.c
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/gssftp/ftpd/ftpd.c	(revision 22425)
3a4e543
+++ krb5/src/appl/gssftp/ftpd/ftpd.c	(working copy)
3a4e543
@@ -1146,7 +1146,11 @@
3a4e543
 done:
3a4e543
 	(*closefunc)(fin);
3a4e543
 	if (logging > 2 && !cmd)
3a4e543
-	        syslog(LOG_NOTICE, "get: %i bytes transferred", byte_count);
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+	        syslog(LOG_NOTICE, "get: %lld bytes transferred", (long long) byte_count);
3a4e543
+#else
3a4e543
+	        syslog(LOG_NOTICE, "get: %ld bytes transferred", (long) byte_count);
3a4e543
+#endif
3a4e543
 }
3a4e543
 
3a4e543
 void
3a4e543
@@ -1191,7 +1195,7 @@
bee687d
 			 * because we are changing from reading to
bee687d
 			 * writing.
bee687d
 			 */
bee687d
-			if (fseek(fout, 0L, L_INCR) < 0) {
bee687d
+			if (FSEEK(fout, 0L, L_INCR) < 0) {
bee687d
 				perror_reply(550, name);
bee687d
 				goto done;
bee687d
 			}
3a4e543
@@ -1216,7 +1220,11 @@
3a4e543
 done:
3a4e543
 	(*closefunc)(fout);
3a4e543
 	if (logging > 2)
3a4e543
-	        syslog(LOG_NOTICE, "put: %i bytes transferred", byte_count);
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+	        syslog(LOG_NOTICE, "get: %lld bytes transferred", byte_count);
3a4e543
+#else
3a4e543
+	        syslog(LOG_NOTICE, "get: %ld bytes transferred", (long) byte_count);
3a4e543
+#endif
3a4e543
 }
3a4e543
 
3a4e543
 FILE *
3a4e543
@@ -1278,8 +1286,13 @@
bee687d
 	byte_count = 0;
bee687d
 	if (size != (off_t) -1)
bee687d
 		/* cast size to long in case sizeof(off_t) > sizeof(long) */
bee687d
+#ifdef HAVE_LONG_LONG
bee687d
+		(void) snprintf (sizebuf, sizeof(sizebuf), " (%lld bytes)",
bee687d
+				 (long long)size);
bee687d
+#else
bee687d
 		(void) snprintf (sizebuf, sizeof(sizebuf), " (%ld bytes)",
bee687d
 				 (long)size);
bee687d
+#endif
bee687d
 	else
bee687d
 		sizebuf[0] = '\0';
bee687d
 	if (pdata >= 0) {
3a4e543
@@ -1991,13 +2004,23 @@
bee687d
 		siglongjmp(urgcatch, 1);
bee687d
 	}
bee687d
 	if (strcmp(cp, "STAT") == 0) {
bee687d
+#ifdef HAVE_LONG_LONG
3a4e543
 		if (file_size != (off_t) -1)
bee687d
+			reply(213, "Status: %llu of %llu bytes transferred",
bee687d
+			      (unsigned long long) byte_count, 
bee687d
+			      (unsigned long long) file_size);
bee687d
+		else
bee687d
+			reply(213, "Status: %llu bytes transferred", 
bee687d
+			      (unsigned long long) byte_count);
bee687d
+#else
3a4e543
+		if (file_size != (off_t) -1)
bee687d
 			reply(213, "Status: %lu of %lu bytes transferred",
bee687d
 			      (unsigned long) byte_count, 
3a4e543
 			      (unsigned long) file_size);
bee687d
 		else
bee687d
 			reply(213, "Status: %lu bytes transferred", 
bee687d
 			      (unsigned long) byte_count);
bee687d
+#endif
bee687d
 	}
bee687d
 }
bee687d
 
3a4e543
Index: krb5/src/appl/bsd/configure.in
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/bsd/configure.in	(revision 22425)
3a4e543
+++ krb5/src/appl/bsd/configure.in	(working copy)
3a4e543
@@ -51,6 +51,9 @@
3a4e543
 AC_TYPE_MODE_T
3a4e543
 AC_CHECK_FUNCS(isatty inet_aton getenv gettosbyname killpg initgroups setpriority setreuid setresuid waitpid setsid ptsname setlogin tcgetpgrp tcsetpgrp setpgid strsave utimes rmufile rresvport_af)
3a4e543
 AC_CHECK_HEADERS(unistd.h stdlib.h string.h sys/filio.h sys/sockio.h sys/label.h sys/tty.h ttyent.h lastlog.h sys/select.h sys/ptyvar.h utmp.h sys/time.h sys/ioctl_compat.h paths.h arpa/nameser.h)
3a4e543
+AC_SYS_LARGEFILE
3a4e543
+AC_FUNC_FSEEKO
3a4e543
+AC_CHECK_TYPES([long long])
3a4e543
 AC_HEADER_STDARG
3a4e543
 AC_REPLACE_FUNCS(getdtablesize)
3a4e543
 dnl
3a4e543
Index: krb5/src/appl/bsd/krcp.c
3a4e543
===================================================================
3a4e543
--- krb5/src/appl/bsd/krcp.c	(revision 22425)
3a4e543
+++ krb5/src/appl/bsd/krcp.c	(working copy)
3a4e543
@@ -764,8 +764,13 @@
3a4e543
 		continue;
3a4e543
 	    }
3a4e543
 	}
3a4e543
+#ifdef HAVE_LONG_LONG
3a4e543
+	(void) snprintf(buf, sizeof(buf), "C%04o %lld %s\n",
3a4e543
+			(int) stb.st_mode&07777, (long long) stb.st_size, last);
bee687d
+#else
3a4e543
 	(void) snprintf(buf, sizeof(buf), "C%04o %ld %s\n",
3a4e543
 			(int) stb.st_mode&07777, (long ) stb.st_size, last);
bee687d
+#endif
3a4e543
 	(void) rcmd_stream_write(rem, buf, strlen(buf), 0);
3a4e543
 	if (response() < 0) {
3a4e543
 	    (void) close(f);