xref: /titanic_52/usr/src/uts/common/syscall/rename.c (revision 8535923051a46cbc5d4842231151bbd31b9e6f4b)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
58fd04b83SRoger A. Faulkner  * Common Development and Distribution License (the "License").
68fd04b83SRoger A. Faulkner  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
218fd04b83SRoger A. Faulkner 
227c478bd9Sstevel@tonic-gate /*
23*85359230SRoger A. Faulkner  * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
277c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate /*
307c478bd9Sstevel@tonic-gate  * Portions of this source code were derived from Berkeley 4.3 BSD
317c478bd9Sstevel@tonic-gate  * under license from the Regents of the University of California.
327c478bd9Sstevel@tonic-gate  */
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate #include <sys/param.h>
357c478bd9Sstevel@tonic-gate #include <sys/isa_defs.h>
367c478bd9Sstevel@tonic-gate #include <sys/types.h>
377c478bd9Sstevel@tonic-gate #include <sys/sysmacros.h>
387c478bd9Sstevel@tonic-gate #include <sys/systm.h>
397c478bd9Sstevel@tonic-gate #include <sys/errno.h>
407c478bd9Sstevel@tonic-gate #include <sys/vnode.h>
417c478bd9Sstevel@tonic-gate #include <sys/uio.h>
427c478bd9Sstevel@tonic-gate #include <sys/debug.h>
437c478bd9Sstevel@tonic-gate #include <sys/file.h>
447c478bd9Sstevel@tonic-gate #include <sys/fcntl.h>
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate /*
477c478bd9Sstevel@tonic-gate  * Rename a file relative to a given directory
487c478bd9Sstevel@tonic-gate  */
497c478bd9Sstevel@tonic-gate int
507c478bd9Sstevel@tonic-gate renameat(int fromfd, char *old, int tofd, char *new)
517c478bd9Sstevel@tonic-gate {
52*85359230SRoger A. Faulkner 	vnode_t	*fromvp = NULL;
53*85359230SRoger A. Faulkner 	vnode_t	*tovp = NULL;
54*85359230SRoger A. Faulkner 	file_t *fp;
557c478bd9Sstevel@tonic-gate 	int error;
56*85359230SRoger A. Faulkner 	char oldstart;
57*85359230SRoger A. Faulkner 	char newstart;
587c478bd9Sstevel@tonic-gate 
59*85359230SRoger A. Faulkner 	if (copyin(old, &oldstart, sizeof (char)) ||
60*85359230SRoger A. Faulkner 	    copyin(new, &newstart, sizeof (char)))
617c478bd9Sstevel@tonic-gate 		return (set_errno(EFAULT));
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate 	if (fromfd == AT_FDCWD || tofd == AT_FDCWD) {
64*85359230SRoger A. Faulkner 		proc_t *p = curproc;
65*85359230SRoger A. Faulkner 
667c478bd9Sstevel@tonic-gate 		mutex_enter(&p->p_lock);
677c478bd9Sstevel@tonic-gate 		if (fromfd == AT_FDCWD) {
687c478bd9Sstevel@tonic-gate 			fromvp = PTOU(p)->u_cdir;
697c478bd9Sstevel@tonic-gate 			VN_HOLD(fromvp);
707c478bd9Sstevel@tonic-gate 		}
717c478bd9Sstevel@tonic-gate 		if (tofd == AT_FDCWD) {
727c478bd9Sstevel@tonic-gate 			tovp = PTOU(p)->u_cdir;
737c478bd9Sstevel@tonic-gate 			VN_HOLD(tovp);
747c478bd9Sstevel@tonic-gate 		}
757c478bd9Sstevel@tonic-gate 		mutex_exit(&p->p_lock);
767c478bd9Sstevel@tonic-gate 	}
777c478bd9Sstevel@tonic-gate 
78*85359230SRoger A. Faulkner 	if (fromvp == NULL && oldstart != '/') {
79*85359230SRoger A. Faulkner 		if ((fp = getf(fromfd)) == NULL) {
807c478bd9Sstevel@tonic-gate 			if (tovp != NULL)
817c478bd9Sstevel@tonic-gate 				VN_RELE(tovp);
827c478bd9Sstevel@tonic-gate 			return (set_errno(EBADF));
837c478bd9Sstevel@tonic-gate 		}
84*85359230SRoger A. Faulkner 		fromvp = fp->f_vnode;
857c478bd9Sstevel@tonic-gate 		VN_HOLD(fromvp);
867c478bd9Sstevel@tonic-gate 		releasef(fromfd);
877c478bd9Sstevel@tonic-gate 	}
887c478bd9Sstevel@tonic-gate 
89*85359230SRoger A. Faulkner 	if (tovp == NULL && newstart != '/') {
90*85359230SRoger A. Faulkner 		if ((fp = getf(tofd)) == NULL) {
917c478bd9Sstevel@tonic-gate 			if (fromvp != NULL)
927c478bd9Sstevel@tonic-gate 				VN_RELE(fromvp);
937c478bd9Sstevel@tonic-gate 			return (set_errno(EBADF));
947c478bd9Sstevel@tonic-gate 		}
95*85359230SRoger A. Faulkner 		tovp = fp->f_vnode;
967c478bd9Sstevel@tonic-gate 		VN_HOLD(tovp);
977c478bd9Sstevel@tonic-gate 		releasef(tofd);
987c478bd9Sstevel@tonic-gate 	}
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 	error = vn_renameat(fromvp, old, tovp, new, UIO_USERSPACE);
1017c478bd9Sstevel@tonic-gate 
1027c478bd9Sstevel@tonic-gate 	if (fromvp != NULL)
1037c478bd9Sstevel@tonic-gate 		VN_RELE(fromvp);
1047c478bd9Sstevel@tonic-gate 	if (tovp != NULL)
1057c478bd9Sstevel@tonic-gate 		VN_RELE(tovp);
106*85359230SRoger A. Faulkner 	if (error)
1077c478bd9Sstevel@tonic-gate 		return (set_errno(error));
108*85359230SRoger A. Faulkner 	return (0);
1097c478bd9Sstevel@tonic-gate }
1108fd04b83SRoger A. Faulkner 
1118fd04b83SRoger A. Faulkner int
1128fd04b83SRoger A. Faulkner rename(char *old, char *new)
1138fd04b83SRoger A. Faulkner {
1148fd04b83SRoger A. Faulkner 	return (renameat(AT_FDCWD, old, AT_FDCWD, new));
1158fd04b83SRoger A. Faulkner }
116