Viewing: openfilleddirunlink.c

// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 */

/* for O_DIRECTORY */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>

char fname[1024];

int main(int argc, char **argv)
{
	char *dname1;
	int fddir1, rc;
	int fd;

	if (argc != 2) {
		fprintf(stderr, "usage: %s dirname1\n", argv[0]);
		exit(1);
	}

	dname1 = argv[1];

	/* create the directory */
	fprintf(stderr, "creating directory %s\n", dname1);
	rc = mkdir(dname1, 0744);
	if (rc == -1) {
		fprintf(stderr, "creating %s fails: %s\n",
			dname1, strerror(errno));
		exit(1);
	}

	snprintf(fname, sizeof(fname), "%s/0", dname1);
	fprintf(stderr, "creating file %s\n", fname);
	fd = creat(fname, 0666);
	if (fd < 0) {
		fprintf(stderr, "creation %s fails: %s\n",
			fname, strerror(errno));
		exit(1);
	}
	close(fd);

	/* open the dir again */
	fprintf(stderr, "opening directory\n");
	fddir1 = open(dname1, O_RDONLY | O_DIRECTORY);
	if (fddir1 == -1) {
		fprintf(stderr, "open %s fails: %s\n",
			dname1, strerror(errno));
		exit(1);
	}

	/* delete the dir */
	fprintf(stderr, "unlinking %s\n", dname1);
	rc = rmdir(dname1);
	if (rc == 0) {
		fprintf(stderr, "unlinked non-empty %s successfully\n",
			dname1);
		exit(1);
	}

	if (access(dname1, F_OK) != 0) {
		fprintf(stderr, "can't access %s: %s\n",
			dname1, strerror(errno));
		exit(1);
	}

	fprintf(stderr, "Ok, everything goes well.\n");
	return 0;
}