#include "request.h" #include "transport.h" #include #include #include #include #include #include int sprkl_transport_sendrequest( struct sprkl_transport* t, struct sprkl_request* request) { return t->sendrequest(t, request); } int sprkl_transport_recvrequest( struct sprkl_transport* t, struct sprkl_request* request) { return t->recvrequest(t, request); } int sprkl_transport_sendresponse( struct sprkl_transport* t, struct sprkl_response* response) { return t->sendresponse(t, response); } int sprkl_transport_recvresponse( struct sprkl_transport* t, struct sprkl_response* response) { return t->recvresponse(t, response); } char* sprkl_transport_strerror(struct sprkl_transport* t, int error) { return t->strerror(t, error); } static int _transport_stream_sendrequest( struct sprkl_transport* self, struct sprkl_request* request) { errno = 0; sprkl_request_write(request, (FILE*) self->opaque); return errno; } static int _transport_stream_recvrequest( struct sprkl_transport* self, struct sprkl_request* request) { errno = 0; sprkl_request_read(request, (FILE*) self->opaque); return errno; } static int _transport_stream_sendresponse( struct sprkl_transport* self, struct sprkl_response* response) { errno = 0; sprkl_response_write(response, (FILE*) self->opaque); return errno; } static int _transport_stream_recvresponse( struct sprkl_transport* self, struct sprkl_response* response) { errno = 0; sprkl_response_read(response, (FILE*) self->opaque); return errno; } static char* _transport_stream_strerror(struct sprkl_transport* t, int error) { (void) t; // shut up -Wunused-parameter return strerror(error); } struct sprkl_transport sprkl_transport_make_stream(FILE* stream) { struct sprkl_transport t = { .opaque = stream, .sendrequest = _transport_stream_sendrequest, .recvrequest = _transport_stream_recvrequest, .sendresponse = _transport_stream_sendresponse, .recvresponse = _transport_stream_recvresponse, .strerror = _transport_stream_strerror }; return t; } int sprkl_transport_make_default(struct sprkl_transport* transport) { char* host = getenv("SPRKL_TMP_DEFTP_HOST"); char* port = getenv("SPRKL_TMP_DEFTP_PORT"); if (host == NULL || port == NULL) return -1; //! \todo make this much more robust struct sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(host); sa.sin_port = htons(atoi(port)); // so that strerror works for connect errors: transport->strerror = _transport_stream_strerror; int sock = socket(AF_INET, SOCK_STREAM, 6); if (connect(sock, (struct sockaddr*) &sa, sizeof sa)) return errno; FILE* stream = fdopen(sock, "r+"); *transport = sprkl_transport_make_stream(stream); return 0; } void sprkl_transport_fini_default(struct sprkl_transport* transport) { fclose((FILE*) transport->opaque); // i hope it's a stream transport... }