static rc_t CC KBufferedStreamWhack ( KBufferedStream *self ) { if ( self -> out_buffer != NULL && self -> out_marker != 0 ) { size_t num_writ; KStreamWriteAll ( self -> out, self -> out_buffer, self -> out_marker, & num_writ ); } KStreamRelease ( self -> in ); KStreamRelease ( self -> out ); if ( self -> in_buffer != NULL ) free ( self -> in_buffer ); if ( self -> out_buffer != NULL ) free ( self -> out_buffer ); free ( self ); return 0; }
rc_t raw_search_request( const request_params * request, on_string_t on_line, uint32_t * rslt_code, void * data ) { rc_t rc; cgi_request * req; request_params validated_request; validate_request_params( request, &validated_request ); rc = make_cgi_request( &req, validated_request.search_url ); if ( rc == 0 ) { const char ** ptr = validated_request.terms; rc = add_cgi_request_param( req, "version=%s", validated_request.search_ver ); while ( rc == 0 && *ptr != NULL ) { rc = add_cgi_request_param( req, "term=%s", *ptr ); ptr++; } ptr = validated_request.params; while ( rc == 0 && *ptr != NULL ) { rc = add_cgi_request_param( req, "%s", *ptr ); ptr++; } if ( rc == 0 ) { struct KStream * stream; rc = perform_cgi_request( req, &stream, rslt_code ); if ( rc == 0 ) { rc = stream_line_read( stream, on_line, validated_request.buffer_size, validated_request.timeout_ms, data ); KStreamRelease( stream ); } } release_cgi_request( req ); } return rc; }
static rc_t CC _HttpStreamCloseInternals_ZHR ( const struct XFSHttpStream * self ) { struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self; if ( Stream == 0 ) { return 0; } if ( Stream -> str != NULL ) { KStreamRelease ( Stream -> str ); Stream -> str = NULL; } if ( Stream -> res != NULL ) { KClientHttpResultRelease ( Stream -> res ); Stream -> res = NULL; } if ( Stream -> req != NULL ) { KClientHttpRequestRelease ( Stream -> req ); Stream -> req = NULL; } if ( Stream -> http != NULL ) { KClientHttpRelease ( Stream -> http ); Stream -> http = NULL; } return 0; } /* _HttpStreamCloseInternals_ZHR () */
rc_t CC KMain (int argc, char * argv[]) { Args * args; uint32_t pcount; rc_t rc = ArgsMakeAndHandle (&args, argc, argv, 1, Options, sizeof Options / sizeof (OptDef)); if ( rc == 0 ) { rc = ArgsParamCount (args, &pcount); if ( rc == 0 ) { if ( pcount != 0 ) { rc = RC(rcApp, rcArgv, rcAccessing, rcParam, rcExcessive); MiniUsage (args); } else { const KStream *std_in; rc = KStreamMakeStdIn ( & std_in ); if ( rc == 0 ) { KStream* buffered; rc = KStreamMakeBuffered ( &buffered, std_in, 0 /*input-only*/, 0 /*use default size*/ ); if ( rc == 0 ) { GeneralLoader loader ( *buffered ); rc = ArgsOptionCount (args, OPTION_INCLUDE_PATHS, &pcount); if ( rc == 0 ) { for ( uint32_t i = 0 ; i < pcount; ++i ) { const char* value; rc = ArgsOptionValue (args, OPTION_INCLUDE_PATHS, i, &value); if ( rc != 0 ) { break; } loader . AddSchemaIncludePath ( value ); } } rc = ArgsOptionCount (args, OPTION_SCHEMAS, &pcount); if ( rc == 0 ) { for ( uint32_t i = 0 ; i < pcount; ++i ) { const char* value; rc = ArgsOptionValue (args, OPTION_SCHEMAS, i, &value); if ( rc != 0 ) { break; } loader . AddSchemaFile( value ); } } rc = ArgsOptionCount (args, OPTION_TARGET, &pcount); if ( rc == 0 && pcount == 1 ) { const char* value; rc = ArgsOptionValue (args, OPTION_TARGET, 0, &value); if ( rc == 0 ) { loader . SetTargetOverride ( value ); } } if ( rc == 0 ) { rc = loader . Run(); } KStreamRelease ( buffered ); } KStreamRelease ( std_in ); } } } } if ( rc != 0) { LOGERR ( klogErr, rc, "load failed" ); } ArgsWhack(args); return rc; }
/* MakeBuffered * makes a one or two-way stream buffer */ LIB_EXPORT rc_t CC KStreamMakeBuffered ( KStream ** buffered, const KStream * in, KStream * out, size_t buffer_size ) { rc_t rc; if ( buffered == NULL ) rc = RC ( rcNS, rcStream, rcConstructing, rcParam, rcNull ); else { bool can_read = ( in == NULL ) ? false : in -> read_enabled; bool can_write = ( out == NULL ) ? false : out -> write_enabled; if ( ! can_read && ! can_write ) rc = RC ( rcNS, rcStream, rcConstructing, rcStream, rcNoPerm ); else { KBufferedStream * bs = calloc ( 1, sizeof * bs ); if ( bs == NULL ) rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted ); else { rc = KStreamInit ( & bs -> dad, ( const KStream_vt* ) & vtKBufferedStream, "KBufferedStream", "adapter", can_read, can_write ); if ( rc == 0 ) { bs -> buffer_size = buffer_size ? buffer_size : DEFAULT_BUFFER_SIZE; if ( in != NULL ) bs -> in_buffer = malloc ( bs -> buffer_size ); if ( out != NULL ) bs -> out_buffer = malloc ( bs -> buffer_size ); if ( ( in != NULL && bs -> in_buffer == NULL ) || ( out != NULL && bs -> out_buffer == NULL ) ) { rc = RC ( rcNS, rcStream, rcConstructing, rcMemory, rcExhausted ); } else { rc = KStreamAddRef ( in ); if ( rc == 0 ) { rc = KStreamAddRef ( out ); if ( rc == 0 ) { bs -> in = in; bs -> out = out; * buffered = & bs -> dad; return 0; } KStreamRelease ( in ); } } if ( bs -> in_buffer != NULL ) free ( bs -> in_buffer ); if ( bs -> out_buffer != NULL ) free ( bs -> out_buffer ); } free ( bs ); } } * buffered = NULL; } return rc; }
rc_t raw_names_request( const request_params * request, on_string_t on_line, uint32_t * rslt_code, void * data ) { rc_t rc; cgi_request * req; request_params validated_request; validate_request_params( request, &validated_request ); rc = make_cgi_request( &req, validated_request.names_url ); if ( rc == 0 ) { int i = 0; const char ** ptr = validated_request.terms; rc = add_cgi_request_param( req, "version=%s", validated_request.names_ver ); for ( i = 0; rc == 0 && *ptr != NULL; ++ i, ++ ptr ) { if ( validated_request . names_ver [ 0 ] < '3' ) rc = add_cgi_request_param( req, "acc=%s", *ptr ); else rc = add_cgi_request_param( req, "object=%d||%s", i, *ptr ); } rc = add_cgi_request_param ( req, "accept-proto=%s", validated_request . proto ); ptr = validated_request.params; while ( rc == 0 && *ptr != NULL ) { rc = add_cgi_request_param( req, "%s", *ptr ); ptr++; } if ( rc == 0 && validated_request . projects != NULL && validated_request . projects [ 0 ] != 0 ) { const KRepositoryMgr * mgr = NULL; uint32_t * ptr = NULL; rc = KRepositoryMgr_Make ( & mgr ); for ( ptr = validated_request . projects; rc == 0 && * ptr != 0; ++ ptr ) { char buffer [ 64 ] = ""; size_t ticket_size = 0; rc = KRepositoryMgr_DownloadTicket ( mgr, * ptr, buffer, sizeof buffer, & ticket_size ); if ( rc != 0 ) PLOGERR ( klogErr, ( klogErr, rc, "Cannot add project '$(p)'", "p=%u", * ptr ) ); else rc = add_cgi_request_param ( req, "tic=%.*s", ( int ) ticket_size, buffer ); } RELEASE ( KRepositoryMgr, mgr ); } if ( rc == 0 ) { struct KStream * stream; rc = perform_cgi_request( req, &stream, rslt_code ); if ( rc == 0 ) { rc = stream_line_read( stream, on_line, validated_request.buffer_size, validated_request.timeout_ms, data ); KStreamRelease( stream ); } } release_cgi_request( req ); } return rc; }