usr/src/lib/libc/port/gen/truncate.c
author Casper H.S. Dik <Casper.Dik@Sun.COM>
Wed, 28 Apr 2010 10:01:37 +0200
changeset 12273 63678502e95e
parent 6812 febeba71273d
permissions -rw-r--r--
PSARC 2009/377 In-kernel pfexec implementation. PSARC 2009/378 Basic File Privileges PSARC 2010/072 RBAC update: user attrs from profiles 4912090 pfzsh(1) should exist 4912093 pfbash(1) should exist 4912096 pftcsh(1) should exist 6440298 Expand the basic privilege set in order to restrict file access 6859862 Move pfexec into the kernel 6919171 cred_t sidesteps kmem_debug; we need to be able to detect bad hold/free when they occur 6923721 The new SYS_SMB privilege is not backward compatible 6937562 autofs doesn't remove its door when the zone shuts down 6937727 Zones stuck on deathrow; netstack_zone keeps a credential reference to the zone 6940159 Implement PSARC 2010/072
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    30
#pragma ident	"%Z%%M%	%I%	%E% SMI"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * ftruncate() and truncate() set a file to a specified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 * length using fcntl(F_FREESP) system call. If the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * was previously longer than length, the bytes past the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 * length will no longer be accessible. If it was shorter,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 * bytes not written will be zero filled.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/feature_tests.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    43
#pragma weak _ftruncate64 = ftruncate64
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    44
#pragma weak _truncate64 = truncate64
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    45
#define	ftruncate	ftruncate64
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    46
#define	truncate	truncate64
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#endif /* !_LP64 && _FILE_OFFSET_BITS == 64 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    49
#include "lint.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <fcntl.h>
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    53
#include <pthread.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
int
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    57
ftruncate(int fildes, off_t len)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	struct flock lck;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	lck.l_whence = 0;	/* offset l_start from beginning of file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	lck.l_start = len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	lck.l_type = F_WRLCK;	/* setting a write lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	lck.l_len = (off_t)0;	/* until the end of the file address space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	if (fcntl(fildes, F_FREESP, &lck) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
int
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 5891
diff changeset
    73
truncate(const char *path, off_t len)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    76
	int rval = 0;
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    77
	int cancel_state;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	int fd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    80
	/*
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    81
	 * truncate() is not a cancellation point,
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    82
	 * even though it calls open() and close().
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    83
	 */
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    84
	(void) pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cancel_state);
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    85
	if ((fd = open(path, O_WRONLY)) == -1 || ftruncate(fd, len) == -1)
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    86
		rval = -1;
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    87
	if (fd >= 0)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		(void) close(fd);
5891
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    89
	(void) pthread_setcancelstate(cancel_state, NULL);
0d5c6468bb04 6598890 cancellation code abuses synonyms
raf
parents: 0
diff changeset
    90
	return (rval);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
}