1207618Srdivacky/* $NetBSD: t_renameat.c,v 1.1 2012/11/18 17:41:54 manu Exp $ */ 2207618Srdivacky 3353358Sdim/*- 4353358Sdim * Copyright (c) 2012 The NetBSD Foundation, Inc. 5353358Sdim * All rights reserved. 6207618Srdivacky * 7207618Srdivacky * This code is derived from software contributed to The NetBSD Foundation 8207618Srdivacky * by Emmanuel Dreyfus. 9207618Srdivacky * 10207618Srdivacky * Redistribution and use in source and binary forms, with or without 11207618Srdivacky * modification, are permitted provided that the following conditions 12207618Srdivacky * are met: 13207618Srdivacky * 1. Redistributions of source code must retain the above copyright 14207618Srdivacky * notice, this list of conditions and the following disclaimer. 15207618Srdivacky * 2. Redistributions in binary form must reproduce the above copyright 16360784Sdim * notice, this list of conditions and the following disclaimer in the 17360784Sdim * documentation and/or other materials provided with the distribution. 18207618Srdivacky * 19207618Srdivacky * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20207618Srdivacky * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21207618Srdivacky * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22207618Srdivacky * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23207618Srdivacky * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24207618Srdivacky * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25207618Srdivacky * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26207618Srdivacky * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27207618Srdivacky * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28207618Srdivacky * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29207618Srdivacky * POSSIBILITY OF SUCH DAMAGE. 30207618Srdivacky */ 31207618Srdivacky#include <sys/cdefs.h> 32207618Srdivacky__RCSID("$NetBSD: t_renameat.c,v 1.1 2012/11/18 17:41:54 manu Exp $"); 33207618Srdivacky 34207618Srdivacky#include <atf-c.h> 35207618Srdivacky#include <errno.h> 36207618Srdivacky#include <fcntl.h> 37207618Srdivacky#include <limits.h> 38207618Srdivacky#include <paths.h> 39207618Srdivacky#include <stdio.h> 40207618Srdivacky#include <string.h> 41239462Sdim#include <unistd.h> 42239462Sdim#include <sys/param.h> 43207618Srdivacky#include <sys/stat.h> 44207618Srdivacky 45239462Sdim#define ODIR "olddir" 46207618Srdivacky#define NDIR "newdir" 47207618Srdivacky#define FILE "olddir/old" 48239462Sdim#define BASEFILE "old" 49239462Sdim#define RELFILE "../olddir/old" 50239462Sdim#define TARGET "newdir/new" 51207618Srdivacky#define BASETARGET "new" 52207618Srdivacky#define FILEERR "olddir/olderr" 53239462Sdim 54239462SdimATF_TC(renameat_fd); 55239462SdimATF_TC_HEAD(renameat_fd, tc) 56239462Sdim{ 57239462Sdim atf_tc_set_md_var(tc, "descr", "See that renameat works with fd"); 58207618Srdivacky} 59207618SrdivackyATF_TC_BODY(renameat_fd, tc) 60239462Sdim{ 61234353Sdim int ofd, nfd, fd; 62207618Srdivacky struct stat ost, nst; 63207618Srdivacky 64207618Srdivacky ATF_REQUIRE(mkdir(ODIR, 0755) == 0); 65207618Srdivacky ATF_REQUIRE(mkdir(NDIR, 0755) == 0); 66239462Sdim ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 67207618Srdivacky ATF_REQUIRE(close(fd) != -1); 68207618Srdivacky 69239462Sdim ATF_REQUIRE(stat(FILE, &ost) == 0); 70239462Sdim 71239462Sdim ATF_REQUIRE((ofd = open(ODIR, O_RDONLY, 0)) != -1); 72239462Sdim ATF_REQUIRE((nfd = open(NDIR, O_RDONLY, 0)) != -1); 73239462Sdim ATF_REQUIRE(renameat(ofd, BASEFILE, nfd, BASETARGET) == 0); 74344779Sdim ATF_REQUIRE(close(ofd) == 0); 75207618Srdivacky ATF_REQUIRE(close(nfd) == 0); 76288943Sdim 77288943Sdim ATF_REQUIRE(stat(TARGET, &nst) == 0); 78288943Sdim ATF_REQUIRE(ost.st_ino == nst.st_ino); 79288943Sdim} 80288943Sdim 81288943SdimATF_TC(renameat_fdcwd); 82288943SdimATF_TC_HEAD(renameat_fdcwd, tc) 83280031Sdim{ 84276479Sdim atf_tc_set_md_var(tc, "descr", 85276479Sdim "See that renameat works with fd as AT_FDCWD"); 86276479Sdim} 87276479Sdim 88276479SdimATF_TC_BODY(renameat_fdcwd, tc) 89239462Sdim{ 90239462Sdim int fd; 91239462Sdim struct stat ost, nst; 92207618Srdivacky 93207618Srdivacky ATF_REQUIRE(mkdir(ODIR, 0755) == 0); 94309124Sdim ATF_REQUIRE(mkdir(NDIR, 0755) == 0); 95309124Sdim ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 96309124Sdim ATF_REQUIRE(close(fd) != -1); 97309124Sdim 98309124Sdim ATF_REQUIRE(stat(FILE, &ost) == 0); 99239462Sdim 100239462Sdim ATF_REQUIRE(renameat(AT_FDCWD, FILE, AT_FDCWD, TARGET) == 0); 101239462Sdim 102239462Sdim ATF_REQUIRE(stat(TARGET, &nst) == 0); 103207618Srdivacky ATF_REQUIRE(ost.st_ino == nst.st_ino); 104207618Srdivacky} 105239462Sdim 106239462SdimATF_TC(renameat_fdcwderr); 107239462SdimATF_TC_HEAD(renameat_fdcwderr, tc) 108239462Sdim{ 109208599Srdivacky atf_tc_set_md_var(tc, "descr", 110208599Srdivacky "See that renameat fails with fd as AT_FDCWD and bad path"); 111239462Sdim} 112239462SdimATF_TC_BODY(renameat_fdcwderr, tc) 113239462Sdim{ 114239462Sdim int fd; 115208599Srdivacky 116208599Srdivacky ATF_REQUIRE(mkdir(ODIR, 0755) == 0); 117296417Sdim ATF_REQUIRE(mkdir(NDIR, 0755) == 0); 118296417Sdim ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 119296417Sdim ATF_REQUIRE(close(fd) != -1); 120296417Sdim 121239462Sdim ATF_REQUIRE(renameat(AT_FDCWD, FILEERR, AT_FDCWD, TARGET) == -1); 122239462Sdim} 123239462Sdim 124239462SdimATF_TC(renameat_fderr); 125239462SdimATF_TC_HEAD(renameat_fderr, tc) 126207618Srdivacky{ 127207618Srdivacky atf_tc_set_md_var(tc, "descr", "See that renameat fails with fd as -1"); 128207618Srdivacky} 129239462SdimATF_TC_BODY(renameat_fderr, tc) 130239462Sdim{ 131239462Sdim int fd; 132207618Srdivacky 133207618Srdivacky ATF_REQUIRE(mkdir(ODIR, 0755) == 0); 134207618Srdivacky ATF_REQUIRE(mkdir(NDIR, 0755) == 0); 135207618Srdivacky ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 136207618Srdivacky ATF_REQUIRE(close(fd) != -1); 137207618Srdivacky 138207618Srdivacky ATF_REQUIRE(renameat(-1, FILE, AT_FDCWD, TARGET) == -1); 139207618Srdivacky ATF_REQUIRE(renameat(AT_FDCWD, FILE, -1, TARGET) == -1); 140288943Sdim ATF_REQUIRE(renameat(-1, FILE, -1, TARGET) == -1); 141288943Sdim} 142239462Sdim 143239462SdimATF_TP_ADD_TCS(tp) 144239462Sdim{ 145239462Sdim 146239462Sdim ATF_TP_ADD_TC(tp, renameat_fd); 147207618Srdivacky ATF_TP_ADD_TC(tp, renameat_fdcwd); 148207618Srdivacky ATF_TP_ADD_TC(tp, renameat_fdcwderr); 149207618Srdivacky ATF_TP_ADD_TC(tp, renameat_fderr); 150207618Srdivacky 151210299Sed return atf_no_error(); 152207618Srdivacky} 153207618Srdivacky