t_mkdirat.c revision 1.2
11.2Sjmmv/* $NetBSD: t_mkdirat.c,v 1.2 2013/03/17 04:46:06 jmmv Exp $ */ 21.1Smanu 31.1Smanu/*- 41.1Smanu * Copyright (c) 2012 The NetBSD Foundation, Inc. 51.1Smanu * All rights reserved. 61.1Smanu * 71.1Smanu * This code is derived from software contributed to The NetBSD Foundation 81.1Smanu * by Emmanuel Dreyfus. 91.1Smanu * 101.1Smanu * Redistribution and use in source and binary forms, with or without 111.1Smanu * modification, are permitted provided that the following conditions 121.1Smanu * are met: 131.1Smanu * 1. Redistributions of source code must retain the above copyright 141.1Smanu * notice, this list of conditions and the following disclaimer. 151.1Smanu * 2. Redistributions in binary form must reproduce the above copyright 161.1Smanu * notice, this list of conditions and the following disclaimer in the 171.1Smanu * documentation and/or other materials provided with the distribution. 181.1Smanu * 191.1Smanu * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.1Smanu * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.1Smanu * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.1Smanu * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.1Smanu * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.1Smanu * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.1Smanu * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.1Smanu * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.1Smanu * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.1Smanu * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.1Smanu * POSSIBILITY OF SUCH DAMAGE. 301.1Smanu */ 311.1Smanu#include <sys/cdefs.h> 321.2Sjmmv__RCSID("$NetBSD: t_mkdirat.c,v 1.2 2013/03/17 04:46:06 jmmv Exp $"); 331.1Smanu 341.1Smanu#include <atf-c.h> 351.1Smanu#include <errno.h> 361.1Smanu#include <fcntl.h> 371.1Smanu#include <limits.h> 381.1Smanu#include <paths.h> 391.1Smanu#include <stdio.h> 401.1Smanu#include <string.h> 411.1Smanu#include <unistd.h> 421.1Smanu#include <sys/param.h> 431.1Smanu#include <sys/stat.h> 441.1Smanu 451.1Smanu#define DIR "dir" 461.1Smanu#define SDIR "dir/openat" 471.1Smanu#define BASESDIR "openat" 481.1Smanu#define SDIRERR "dir/openaterr" 491.1Smanu 501.2SjmmvATF_TC(mkdirat_fd); 511.1SmanuATF_TC_HEAD(mkdirat_fd, tc) 521.1Smanu{ 531.1Smanu atf_tc_set_md_var(tc, "descr", "See that mkdirat works with fd"); 541.1Smanu} 551.1SmanuATF_TC_BODY(mkdirat_fd, tc) 561.1Smanu{ 571.1Smanu int dfd; 581.1Smanu mode_t mode = 0755; 591.1Smanu 601.1Smanu ATF_REQUIRE(mkdir(DIR, 0755) == 0); 611.1Smanu ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1); 621.1Smanu ATF_REQUIRE(mkdirat(dfd, BASESDIR, mode) != -1); 631.1Smanu ATF_REQUIRE(close(dfd) == 0); 641.1Smanu ATF_REQUIRE(access(SDIR, F_OK) == 0); 651.1Smanu} 661.1Smanu 671.2SjmmvATF_TC(mkdirat_fdcwd); 681.1SmanuATF_TC_HEAD(mkdirat_fdcwd, tc) 691.1Smanu{ 701.1Smanu atf_tc_set_md_var(tc, "descr", 711.1Smanu "See that mkdirat works with fd as AT_FDCWD"); 721.1Smanu} 731.1SmanuATF_TC_BODY(mkdirat_fdcwd, tc) 741.1Smanu{ 751.1Smanu mode_t mode = 0755; 761.1Smanu 771.1Smanu ATF_REQUIRE(mkdir(DIR, 0755) == 0); 781.1Smanu ATF_REQUIRE(mkdirat(AT_FDCWD, SDIR, mode) != -1); 791.1Smanu ATF_REQUIRE(access(SDIR, F_OK) == 0); 801.1Smanu} 811.1Smanu 821.2SjmmvATF_TC(mkdirat_fdcwderr); 831.1SmanuATF_TC_HEAD(mkdirat_fdcwderr, tc) 841.1Smanu{ 851.1Smanu atf_tc_set_md_var(tc, "descr", 861.1Smanu "See that mkdirat fails with fd as AT_FDCWD and bad path"); 871.1Smanu} 881.1SmanuATF_TC_BODY(mkdirat_fdcwderr, tc) 891.1Smanu{ 901.1Smanu mode_t mode = 0755; 911.1Smanu 921.1Smanu ATF_REQUIRE(mkdirat(AT_FDCWD, SDIRERR, mode) == -1); 931.1Smanu} 941.1Smanu 951.2SjmmvATF_TC(mkdirat_fderr); 961.1SmanuATF_TC_HEAD(mkdirat_fderr, tc) 971.1Smanu{ 981.1Smanu atf_tc_set_md_var(tc, "descr", "See that mkdirat fails with fd as -1"); 991.1Smanu} 1001.1SmanuATF_TC_BODY(mkdirat_fderr, tc) 1011.1Smanu{ 1021.1Smanu int fd; 1031.1Smanu mode_t mode = 0755; 1041.1Smanu 1051.1Smanu ATF_REQUIRE(mkdir(DIR, 0755) == 0); 1061.1Smanu ATF_REQUIRE((fd = open(SDIR, O_CREAT|O_RDWR, 0644)) != -1); 1071.1Smanu ATF_REQUIRE(close(fd) == 0); 1081.1Smanu ATF_REQUIRE(mkdirat(-1, SDIR, mode) == -1); 1091.1Smanu} 1101.1Smanu 1111.1SmanuATF_TP_ADD_TCS(tp) 1121.1Smanu{ 1131.1Smanu 1141.1Smanu ATF_TP_ADD_TC(tp, mkdirat_fd); 1151.1Smanu ATF_TP_ADD_TC(tp, mkdirat_fdcwd); 1161.1Smanu ATF_TP_ADD_TC(tp, mkdirat_fdcwderr); 1171.1Smanu ATF_TP_ADD_TC(tp, mkdirat_fderr); 1181.1Smanu 1191.1Smanu return atf_no_error(); 1201.1Smanu} 121