static void print_error_buffers(struct drm_i915_error_state_buf *m, const char *name, struct drm_i915_error_buffer *err, int count) { err_printf(m, "%s [%d]:\n", name, count); while (count--) { err_printf(m, " %08x %8u %02x %02x %x %x", err->gtt_offset, err->size, err->read_domains, err->write_domain, err->rseqno, err->wseqno); err_puts(m, pin_flag(err->pinned)); err_puts(m, tiling_flag(err->tiling)); err_puts(m, dirty_flag(err->dirty)); err_puts(m, purgeable_flag(err->purgeable)); err_puts(m, err->ring != -1 ? " " : ""); err_puts(m, ring_str(err->ring)); err_puts(m, i915_cache_level_str(err->cache_level)); if (err->name) err_printf(m, " (name: %d)", err->name); if (err->fence_reg != I915_FENCE_REG_NONE) err_printf(m, " (fence: %d)", err->fence_reg); err_puts(m, "\n"); err++; } }
/*! * @brief ソケットを作成する * @param [in] port_num ポート番号 * @return ソケットのディスクリプタ */ static int make_socket(uint port_num) { struct sockaddr_in me; int sock; int sock_new; memset((char *)&me, 0, sizeof(me)); /* aockaddr_in構造体変数meのゼロクリア */ me.sin_family = AF_INET; me.sin_addr.s_addr = htonl(INADDR_ANY); me.sin_port = htons(port_num); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { perror("socket"); return -1; } if (bind(sock, (struct sockaddr *)&me, sizeof(me)) == -1){ perror("bind"); return -1; } listen(sock, 1); err_puts("successfully bound, now waiting."); sock_new = accept(sock, NULL, NULL); close(sock); return sock_new; }
int xchdir(const char *path) { if (chdir(path) == -1) { err_puts("chdir", errno); return -1; } return 0; }
static void err_printf(PHYSFS_File *my_file, const char * format, ... ) #define err_printf(A1,F,...) dxx_call_printf_checked(err_printf,err_puts_literal,(A1),(F),##__VA_ARGS__) { va_list args; char message[256]; va_start(args, format ); size_t len = vsnprintf(message,sizeof(message),format,args); va_end(args); err_puts(my_file, message, len); }
/*! * @brief 引数の文字列をポート番号の数値に変換する * @param [in] str ポート番号に変換する文字列 * @return 変換に成功したならポート番号を、失敗したなら-1を返す */ int convert_str2port(const char *str) { char *check; int num = strtol(str, &check, 10); // char * -> long if (*check != '\0') { err_puts("ポート番号は数値で指定してください"); return -1; } if (num < MIN_PORT || MAX_PORT < num) { err_println("ポート番号は %d~%d の範囲で指定してください", MIN_PRIVATE_PORT, MAX_PRIVATE_PORT); return -1; } if (MIN_WELL_KNOWN_PORT <= num && num <= MAX_WELL_KNOWN_PORT) { err_puts("ウェルノウンポートを指定しないでください。"); err_println("ポート番号は %d~%d の範囲で指定してください", MIN_PRIVATE_PORT, MAX_PRIVATE_PORT); return -1; } if (MIN_REGISTERED_PORT <= num && num <= MAX_REGISTERED_PORT) { err_puts("注意: 登録済みポート番号が指定されています。"); err_println(" ポート番号を %d~%d の範囲で指定することを推奨します", MIN_PRIVATE_PORT, MAX_PRIVATE_PORT); } return num; }
/*! * @brief 引数解析を行う * @param [in] argc コマンドライン引数の個数(プログラム名も含む) * @param [in] argv コマンドライン引数の配列 * @param [out] port_num ポート番号 * @return 引数に異常がなければ0を、異常があれば-1を返す */ static int arg_parse(int argc, char *argv[], int *port_num) { switch (argc) { case 2: *port_num = convert_str2port(argv[1]); if (*port_num == -1) return -1; case 1: *port_num = DEFAULT_PORT; break; default: err_puts("引数は1つにしてください。"); show_usage(argv[0]); return -1; } return 0; }
static void err_puts_literal(PHYSFS_File *f, const char (&str)[len]) { err_puts(f, str, len); }