null+****@clear*****
null+****@clear*****
2012年 5月 23日 (水) 17:01:55 JST
Kouhei Sutou 2012-05-23 17:01:55 +0900 (Wed, 23 May 2012) New Revision: d055f80103599e06b59bf27535112e361b8bf767 Log: groonga: add --output-fd option It's for reading the response of grooga commad from specified file descriptor. It's useful for running groonga command from script. Modified files: src/groonga.c Modified: src/groonga.c (+34 -9) =================================================================== --- src/groonga.c 2012-05-23 16:26:41 +0900 (76d966e) +++ src/groonga.c 2012-05-23 17:01:55 +0900 (0c6ec46) @@ -75,6 +75,7 @@ static int (*do_server)(char *path); static FILE *pid_file = NULL; static const char *pid_file_path = NULL; static const char *input_path = NULL; +static FILE *output = NULL; static grn_encoding encoding; static grn_command_version default_command_version; @@ -729,7 +730,7 @@ do_alone(int argc, char **argv) grn_obj command; GRN_TEXT_INIT(&command, 0); GRN_CTX_USER_DATA(ctx)->ptr = &command; - grn_ctx_recv_handler_set(ctx, s_output, stdout); + grn_ctx_recv_handler_set(ctx, s_output, output); if (!argc) { grn_obj text; GRN_TEXT_INIT(&text, 0); @@ -775,11 +776,11 @@ c_output(grn_ctx *ctx) GRN_TEXT_INIT(&foot, 0); GRN_TEXT_SET(ctx, &body, str, str_len); print_return_code(ctx, ctx->rc, &head, &body, &foot); - fwrite(GRN_TEXT_VALUE(&head), 1, GRN_TEXT_LEN(&head), stdout); - fwrite(GRN_TEXT_VALUE(&body), 1, GRN_TEXT_LEN(&body), stdout); - fwrite(GRN_TEXT_VALUE(&foot), 1, GRN_TEXT_LEN(&foot), stdout); - fputc('\n', stdout); - fflush(stdout); + fwrite(GRN_TEXT_VALUE(&head), 1, GRN_TEXT_LEN(&head), output); + fwrite(GRN_TEXT_VALUE(&body), 1, GRN_TEXT_LEN(&body), output); + fwrite(GRN_TEXT_VALUE(&foot), 1, GRN_TEXT_LEN(&foot), output); + fputc('\n', output); + fflush(output); GRN_OBJ_FIN(ctx, &head); GRN_OBJ_FIN(ctx, &body); GRN_OBJ_FIN(ctx, &foot); @@ -2232,6 +2233,8 @@ static const char * const default_bind_address = "0.0.0.0"; static void init_default_settings(void) { + output = stdout; + default_encoding = grn_strtoenc(GRN_DEFAULT_ENCODING); { @@ -2480,7 +2483,7 @@ main(int argc, char **argv) *cache_limit_arg = NULL, *document_root_arg = NULL, *default_command_version_arg = NULL, *default_match_escalation_threshold_arg = NULL, - *input_fd_arg = NULL; + *input_fd_arg = NULL, *output_fd_arg = NULL; const char *config_path = NULL; int exit_code = EXIT_SUCCESS; int i, mode = mode_alone; @@ -2510,6 +2513,7 @@ main(int argc, char **argv) {'\0', "default-match-escalation-threshold", NULL, 0, getopt_op_none}, {'\0', "bind-address", NULL, 0, getopt_op_none}, {'\0', "input-fd", NULL, 0, getopt_op_none}, + {'\0', "output-fd", NULL, 0, getopt_op_none}, {'\0', NULL, NULL, 0, 0} }; opts[0].arg = &port_arg; @@ -2529,6 +2533,7 @@ main(int argc, char **argv) opts[22].arg = &default_match_escalation_threshold_arg; opts[23].arg = &bind_address_arg; opts[24].arg = &input_fd_arg; + opts[25].arg = &output_fd_arg; init_default_settings(); @@ -2572,10 +2577,10 @@ main(int argc, char **argv) show_version(); return EXIT_SUCCESS; case mode_usage : - show_usage(stdout); + show_usage(output); return EXIT_SUCCESS; case mode_config : - show_config(stdout, opts, mode & ~MODE_MASK); + show_config(output, opts, mode & ~MODE_MASK); return EXIT_SUCCESS; case mode_error : show_usage(stderr); @@ -2709,6 +2714,23 @@ main(int argc, char **argv) } } + if (output_fd_arg) { + const char * const end = output_fd_arg + strlen(output_fd_arg); + const char *rest = NULL; + const int output_fd = grn_atoi(output_fd_arg, end, &rest); + if (rest != end || output_fd == 0) { + fprintf(stderr, "invalid output FD: <%s>\n", output_fd_arg); + return EXIT_FAILURE; + } + output = fdopen(output_fd, "w"); + if (!output) { + fprintf(stderr, "can't open output FD: %d (%s)\n", + output_fd, strerror(errno)); + return EXIT_FAILURE; + } + } + + if (bind_address_arg) { const size_t bind_address_length = strlen(bind_address_arg); if (bind_address_length > HOST_NAME_MAX) { @@ -2866,6 +2888,9 @@ main(int argc, char **argv) line_editor_fin(); } #endif + if (output != stdout) { + fclose(output); + } grn_fin(); return exit_code; }