Newer
Older
access-test / modules / main / src / test_create.c
Nomura Kei on 9 Dec 2022 5 KB UPDATE
/**
 * @file	test_create.c
 * @brief	create テスト
 * @author	Nomura Kei
 * @copyright 2008  Nomura Kei
 */
#include <stdio.h>
#include <errno.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <filetype.h>
#include <test_create.h>


/**
 * 指定されたパスのファイルを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_file(const char* pathname)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// ファイル生成
	bool is_success = false;
	FILE* fp = fopen(pathname, "w");
	if (fp != NULL)
	{
		is_success = true;
		fclose(fp);
	}
	return is_success;
}


/**
 * 指定されたパスのディレクトリを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_directory(const char* pathname)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// ディレクトリ生成
	// mode = 0755
	mode_t mode = S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
	int ret = mkdir(pathname, mode);
	bool is_success = (ret == 0);
	return is_success;
}


/**
 * 指定されたパスのキャラクタデバイスファイルを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @param major    major
 * @param minor    minor
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_character_device_file(const char* pathname, unsigned int maj, unsigned int min)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// キャラクタデバイスファイル生成
	// mode = 0020755
	mode_t mode = S_IFCHR|S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
	dev_t dev = makedev(maj, min);
	int ret = mknod(pathname, mode, dev);
	bool is_success = (ret == 0);
	return is_success;
}


/**
 * 指定されたパスのブロックデバイスファイルを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @param major    major
 * @param minor    minor
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_block_device_file(const char* pathname, unsigned int maj, unsigned int min)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// ブロックデバイスファイル生成
	// mode = 0060755
	mode_t mode = S_IFBLK|S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
	dev_t dev = makedev(maj, min);
	int ret = mknod(pathname, mode, dev);
	bool is_success = (ret == 0);
	return is_success;
}


/**
 * 指定されたパスのソケットを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_socket(const char* pathname)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// ソケット生成
	int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
	bool is_success = false;
	if (sockfd != -1)
	{
		struct sockaddr_un name;
		memset(&name, 0, sizeof(name));
		name.sun_family = AF_UNIX;
		strncpy(name.sun_path, pathname, sizeof(name.sun_path) - 1);
		int ret = bind(sockfd, (const struct sockaddr*) &name, sizeof(name));
		is_success = (ret != -1);
		close(sockfd);
	}
	return is_success;
}


/**
 * 指定されたパスのFIFO(名前付きパイプ)を生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname パス
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_fifo(const char* pathname)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// FIFO(名前付きパイプ)生成
	// mode = 0644
	mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
	int ret = mkfifo(pathname, mode);
	bool is_success = (ret == 0);
	return is_success;
}


/**
 * 指定されたパスのシンボリックリンクを生成します。
 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。
 *
 * @param pathname 作成するシンボリックリンク
 * @param frompath 作成元のパス   
 * @return true/false (生成成功/生成失敗)
 */
bool can_create_symbolic_link(const char* pathname, const char* frompath)
{
	// パス存在有無確認 (存在する場合 NG)
	bool is_error = is_exists(pathname);
	if (is_error)
	{
		errno = EEXIST;
		return false;
	}

	// シンボリックリンク生成
	int ret = symlink(frompath, pathname);
	bool is_success = (ret == 0);
	return is_success;
}