C++程序  |  70行  |  1.39 KB

/**
 * @file file_tests.c
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#include "op_file.h"

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>

static char * tests[][2] = {
	{ "/usr/bin/../bin", "/usr/bin" },
	{ "/../usr/bin/", "/usr/bin" },
	{ "/../../usr/bin/", "/usr/bin" },
	{ "/../../usr/bin/.", "/usr/bin" },
	{ "/../../usr/bin/./", "/usr/bin" },
	{ "/usr/./bin", "/usr/bin" },
	{ "/usr/././bin", "/usr/bin" },
	{ "/usr///", "/usr" },
	{ "../", "/" },
	{ "./", "/usr" },
	{ ".", "/usr" },
	{ "./../", "/" },
	{ "bin/../bin/../", "/usr" },
	{ "../../../../../", "/" },
	{ "/usr/bin/../../..", "/" },
	{ "/usr/bin/../../../", "/" },
	{ "././.", "/usr" },
	/* POSIX namespace ignored by realpath(3) */
	{ "//", "/" },
	{ "//usr", "/usr" },
	{ "///", "/" },
	{ NULL, NULL },
};

int main(void)
{
	char tmp[PATH_MAX];
	size_t i = 0;

	if (chdir("/usr")) {
		fprintf(stderr, "chdir(\"/usr\") failed for %s\n", tests[i][0]);
		exit(EXIT_FAILURE);
	}

	while (tests[i][0]) {
		if (!realpath(tests[i][0], tmp)) {
			fprintf(stderr, "NULL return for %s\n", tests[i][0]);
			exit(EXIT_FAILURE);
		}

		if (strcmp(tmp, tests[i][1])) {
			fprintf(stderr, "%s does not match %s given %s\n",
			        tmp, tests[i][1], tests[i][0]);
			exit(EXIT_FAILURE);
		}
		++i;
	}

	return EXIT_SUCCESS;
}