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