xref: /titanic_51/usr/src/lib/libresolv2/common/bsd/ftruncate.c (revision 9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829)
17c478bd9Sstevel@tonic-gate #ifndef LINT
2*9525b14bSRao Shoaib static const char rcsid[] = "$Id: ftruncate.c,v 1.3 2005/04/27 18:16:45 sra Exp $";
37c478bd9Sstevel@tonic-gate #endif
47c478bd9Sstevel@tonic-gate 
5*9525b14bSRao Shoaib /*! \file
6*9525b14bSRao Shoaib  * \brief
77c478bd9Sstevel@tonic-gate  * ftruncate - set file size, BSD Style
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * shortens or enlarges the file as neeeded
107c478bd9Sstevel@tonic-gate  * uses some undocumented locking call. It is known to work on SCO unix,
117c478bd9Sstevel@tonic-gate  * other vendors should try.
127c478bd9Sstevel@tonic-gate  * The #error directive prevents unsupported OSes
137c478bd9Sstevel@tonic-gate  */
147c478bd9Sstevel@tonic-gate 
157c478bd9Sstevel@tonic-gate #include "port_before.h"
167c478bd9Sstevel@tonic-gate 
177c478bd9Sstevel@tonic-gate #if defined(M_UNIX)
187c478bd9Sstevel@tonic-gate #define OWN_FTRUNCATE
197c478bd9Sstevel@tonic-gate #include <stdio.h>
207c478bd9Sstevel@tonic-gate #ifdef _XOPEN_SOURCE
217c478bd9Sstevel@tonic-gate #undef _XOPEN_SOURCE
227c478bd9Sstevel@tonic-gate #endif
237c478bd9Sstevel@tonic-gate #ifdef _POSIX_SOURCE
247c478bd9Sstevel@tonic-gate #undef _POSIX_SOURCE
257c478bd9Sstevel@tonic-gate #endif
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #include <fcntl.h>
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include "port_after.h"
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate int
327c478bd9Sstevel@tonic-gate __ftruncate(int fd, long wantsize) {
337c478bd9Sstevel@tonic-gate 	long cursize;
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate 	/* determine current file size */
367c478bd9Sstevel@tonic-gate 	if ((cursize = lseek(fd, 0L, 2)) == -1)
377c478bd9Sstevel@tonic-gate 		return (-1);
387c478bd9Sstevel@tonic-gate 
397c478bd9Sstevel@tonic-gate 	/* maybe lengthen... */
407c478bd9Sstevel@tonic-gate 	if (cursize < wantsize) {
417c478bd9Sstevel@tonic-gate 		if (lseek(fd, wantsize - 1, 0) == -1 ||
427c478bd9Sstevel@tonic-gate 		    write(fd, "", 1) == -1) {
437c478bd9Sstevel@tonic-gate 			return (-1);
447c478bd9Sstevel@tonic-gate 		}
457c478bd9Sstevel@tonic-gate 		return (0);
467c478bd9Sstevel@tonic-gate 	}
477c478bd9Sstevel@tonic-gate 
487c478bd9Sstevel@tonic-gate 	/* maybe shorten... */
497c478bd9Sstevel@tonic-gate 	if (wantsize < cursize) {
507c478bd9Sstevel@tonic-gate 		struct flock fl;
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate 		fl.l_whence = 0;
537c478bd9Sstevel@tonic-gate 		fl.l_len = 0;
547c478bd9Sstevel@tonic-gate 		fl.l_start = wantsize;
557c478bd9Sstevel@tonic-gate 		fl.l_type = F_WRLCK;
567c478bd9Sstevel@tonic-gate 		return (fcntl(fd, F_FREESP, &fl));
577c478bd9Sstevel@tonic-gate 	}
587c478bd9Sstevel@tonic-gate 	return (0);
597c478bd9Sstevel@tonic-gate }
607c478bd9Sstevel@tonic-gate #endif
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate #ifndef OWN_FTRUNCATE
637c478bd9Sstevel@tonic-gate int __bindcompat_ftruncate;
647c478bd9Sstevel@tonic-gate #endif
65