/** * @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; }