t_unlinkat.c revision 272458
1251876Speter/* $NetBSD: t_unlinkat.c,v 1.2 2013/03/17 04:46:06 jmmv Exp $ */ 2251876Speter 3251876Speter/*- 4251876Speter * Copyright (c) 2012 The NetBSD Foundation, Inc. 5251876Speter * All rights reserved. 6251876Speter * 7251876Speter * This code is derived from software contributed to The NetBSD Foundation 8251876Speter * by Emmanuel Dreyfus. 9251876Speter * 10251876Speter * Redistribution and use in source and binary forms, with or without 11251876Speter * modification, are permitted provided that the following conditions 12251876Speter * are met: 13251876Speter * 1. Redistributions of source code must retain the above copyright 14251876Speter * notice, this list of conditions and the following disclaimer. 15251876Speter * 2. Redistributions in binary form must reproduce the above copyright 16251876Speter * notice, this list of conditions and the following disclaimer in the 17251876Speter * documentation and/or other materials provided with the distribution. 18251876Speter * 19251876Speter * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20251876Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21251876Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22251876Speter * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23251876Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24251876Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25251876Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26251876Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27251876Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28251876Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29251876Speter * POSSIBILITY OF SUCH DAMAGE. 30251876Speter */ 31251876Speter#include <sys/cdefs.h> 32251876Speter__RCSID("$NetBSD: t_unlinkat.c,v 1.2 2013/03/17 04:46:06 jmmv Exp $"); 33251876Speter 34251876Speter#include <atf-c.h> 35251876Speter#include <errno.h> 36251876Speter#include <fcntl.h> 37251876Speter#include <limits.h> 38251876Speter#include <paths.h> 39251876Speter#include <stdio.h> 40251876Speter#include <string.h> 41251876Speter#include <unistd.h> 42251876Speter#include <sys/param.h> 43251876Speter 44251876Speter#define DIR "dir" 45251876Speter#define FILE "dir/unlinkat" 46251876Speter#define BASEFILE "unlinkat" 47251876Speter#define FILEERR "dir/unlinkaterr" 48251876Speter 49251876SpeterATF_TC(unlinkat_fd); 50251876SpeterATF_TC_HEAD(unlinkat_fd, tc) 51251876Speter{ 52251876Speter atf_tc_set_md_var(tc, "descr", "See that unlinkat works with fd"); 53251876Speter} 54251876SpeterATF_TC_BODY(unlinkat_fd, tc) 55251876Speter{ 56251876Speter int dfd; 57251876Speter int fd; 58251876Speter 59251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 60251876Speter ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 61251876Speter ATF_REQUIRE(close(fd) == 0); 62251876Speter 63251876Speter ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); 64251876Speter ATF_REQUIRE(unlinkat(dfd, BASEFILE, 0) == 0); 65251876Speter ATF_REQUIRE(close(dfd) == 0); 66251876Speter} 67251876Speter 68251876SpeterATF_TC(unlinkat_fdcwd); 69251876SpeterATF_TC_HEAD(unlinkat_fdcwd, tc) 70251876Speter{ 71251876Speter atf_tc_set_md_var(tc, "descr", 72251876Speter "See that unlinkat works with fd as AT_FDCWD"); 73251876Speter} 74251876SpeterATF_TC_BODY(unlinkat_fdcwd, tc) 75251876Speter{ 76251876Speter int fd; 77251876Speter 78251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 79251876Speter ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 80251876Speter ATF_REQUIRE(close(fd) == 0); 81251876Speter 82251876Speter ATF_REQUIRE(chdir(DIR) == 0); 83251876Speter ATF_REQUIRE(unlinkat(AT_FDCWD, BASEFILE, 0) == 0); 84251876Speter} 85251876Speter 86251876SpeterATF_TC(unlinkat_fdcwderr); 87251876SpeterATF_TC_HEAD(unlinkat_fdcwderr, tc) 88251876Speter{ 89251876Speter atf_tc_set_md_var(tc, "descr", 90251876Speter "See that unlinkat fails with fd as AT_FDCWD and bad path"); 91251876Speter} 92251876SpeterATF_TC_BODY(unlinkat_fdcwderr, tc) 93251876Speter{ 94251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 95251876Speter ATF_REQUIRE(unlinkat(AT_FDCWD, FILEERR, 0) == -1); 96251876Speter} 97251876Speter 98251876SpeterATF_TC(unlinkat_fderr1); 99251876SpeterATF_TC_HEAD(unlinkat_fderr1, tc) 100251876Speter{ 101251876Speter atf_tc_set_md_var(tc, "descr", "See that unlinkat fail with bad path"); 102251876Speter} 103251876SpeterATF_TC_BODY(unlinkat_fderr1, tc) 104251876Speter{ 105251876Speter int dfd; 106251876Speter 107251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 108251876Speter ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); 109251876Speter ATF_REQUIRE(unlinkat(dfd, FILEERR, 0) == -1); 110251876Speter ATF_REQUIRE(close(dfd) == 0); 111251876Speter} 112251876Speter 113251876SpeterATF_TC(unlinkat_fderr2); 114251876SpeterATF_TC_HEAD(unlinkat_fderr2, tc) 115251876Speter{ 116251876Speter atf_tc_set_md_var(tc, "descr", "See that unlinkat fails with bad fdat"); 117251876Speter} 118251876SpeterATF_TC_BODY(unlinkat_fderr2, tc) 119251876Speter{ 120251876Speter int dfd; 121251876Speter int fd; 122251876Speter char cwd[MAXPATHLEN]; 123251876Speter 124251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 125251876Speter ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 126251876Speter ATF_REQUIRE(close(fd) == 0); 127251876Speter 128251876Speter ATF_REQUIRE((dfd = open(getcwd(cwd, MAXPATHLEN), O_RDONLY, 0)) != -1); 129251876Speter ATF_REQUIRE(unlinkat(dfd, BASEFILE, 0) == -1); 130251876Speter ATF_REQUIRE(close(dfd) == 0); 131251876Speter} 132251876Speter 133251876SpeterATF_TC(unlinkat_fderr3); 134251876SpeterATF_TC_HEAD(unlinkat_fderr3, tc) 135253734Speter{ 136251876Speter atf_tc_set_md_var(tc, "descr", "See that unlinkat fails with fd as -1"); 137251876Speter} 138251876SpeterATF_TC_BODY(unlinkat_fderr3, tc) 139251876Speter{ 140251876Speter int fd; 141251876Speter 142253734Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 143253734Speter ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1); 144253734Speter ATF_REQUIRE(close(fd) == 0); 145253734Speter 146253734Speter ATF_REQUIRE(unlinkat(-1, FILE, 0) == -1); 147253734Speter} 148253734Speter 149253734SpeterATF_TC(unlinkat_dir); 150253734SpeterATF_TC_HEAD(unlinkat_dir, tc) 151253734Speter{ 152253734Speter atf_tc_set_md_var(tc, "descr", 153253734Speter "See that unlinkat can remove directories"); 154253734Speter} 155253734SpeterATF_TC_BODY(unlinkat_dir, tc) 156251876Speter{ 157251876Speter ATF_REQUIRE(mkdir(DIR, 0755) == 0); 158253734Speter 159251876Speter ATF_REQUIRE(unlinkat(AT_FDCWD, DIR, 0) == -1); 160251876Speter ATF_REQUIRE(errno == EPERM); 161251876Speter ATF_REQUIRE(unlinkat(AT_FDCWD, DIR, AT_REMOVEDIR) == 0); 162251876Speter} 163251876Speter 164251876SpeterATF_TP_ADD_TCS(tp) 165251876Speter{ 166251876Speter 167251876Speter ATF_TP_ADD_TC(tp, unlinkat_fd); 168251876Speter ATF_TP_ADD_TC(tp, unlinkat_fdcwd); 169251876Speter ATF_TP_ADD_TC(tp, unlinkat_fdcwderr); 170251876Speter ATF_TP_ADD_TC(tp, unlinkat_fderr1); 171251876Speter ATF_TP_ADD_TC(tp, unlinkat_fderr2); 172251876Speter ATF_TP_ADD_TC(tp, unlinkat_fderr3); 173251876Speter ATF_TP_ADD_TC(tp, unlinkat_dir); 174251876Speter 175251876Speter return atf_no_error(); 176251876Speter} 177