X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/585d00517aab2ff172e0eb8ef13b749f4a4c2c59..07802098b4ebcddaa55994f7a87fe0b0e8514d04:/projects/stargazer/plugins/other/smux/handlers.cpp diff --git a/projects/stargazer/plugins/other/smux/handlers.cpp b/projects/stargazer/plugins/other/smux/handlers.cpp index 5fb3dfda..5a8c917d 100644 --- a/projects/stargazer/plugins/other/smux/handlers.cpp +++ b/projects/stargazer/plugins/other/smux/handlers.cpp @@ -13,6 +13,13 @@ #include "smux.h" +std::string OI2String(OBJECT_IDENTIFIER_t * oi); +int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse); +int SendGetResponseErrorPDU(int fd, + const PDU_t * getRequest, + int errorStatus, + int errorIndex); + bool SMUX::CloseHandler(const SMUX_PDUs_t * pdus) { printfd(__FILE__, "SMUX::CloseHandler()\n"); @@ -29,7 +36,7 @@ return false; bool SMUX::PDUsRequestHandler(const SMUX_PDUs_t * pdus) { -printfd(__FILE__, "SMUX::PDUsHandler()\n"); +printfd(__FILE__, "SMUX::PDUsRequestHandler()\n"); asn_fprint(stderr, &asn_DEF_SMUX_PDUs, pdus); PDUsHandlers::iterator it; it = pdusHandlers.find(pdus->choice.pdus.present); @@ -42,16 +49,16 @@ else switch (pdus->present) { case PDUs_PR_NOTHING: - printfd(__FILE__, "SMUX::PDUsHandler() - nothing\n"); + printfd(__FILE__, "SMUX::PDUsRequestHandler() - nothing\n"); break; case PDUs_PR_get_response: - printfd(__FILE__, "SMUX::PDUsHandler() - get response\n"); + printfd(__FILE__, "SMUX::PDUsRequestHandler() - get response\n"); break; case PDUs_PR_trap: - printfd(__FILE__, "SMUX::PDUsHandler() - trap\n"); + printfd(__FILE__, "SMUX::PDUsRequestHandler() - trap\n"); break; default: - printfd(__FILE__, "SMUX::PDUsHandler() - undefined\n"); + printfd(__FILE__, "SMUX::PDUsRequestHandler() - undefined\n"); } } return false; @@ -152,3 +159,81 @@ SendGetResponseErrorPDU(sock, &pdus->choice.set_request, PDU__error_status_readOnly, 0); return false; } + +std::string OI2String(OBJECT_IDENTIFIER_t * oi) +{ +std::string res; + +int arcs[1024]; +int count = OBJECT_IDENTIFIER_get_arcs(oi, arcs, sizeof(arcs[0]), 1024); + +if (count > 1024) + return ""; + +for (int i = 0; i < count; ++i) + { + res += "."; + std::string arc; + strprintf(&arc, "%d", arcs[i]); + res += arc; + } + +return res; +} + +int SendGetResponsePDU(int fd, GetResponse_PDU_t * getResponse) +{ +asn_enc_rval_t error; + +char buffer[1024]; +error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, getResponse, buffer, + sizeof(buffer)); + +if (error.encoded == -1) + { + printfd(__FILE__, "Could not encode GetResponsePDU (at %s)\n", + error.failed_type ? error.failed_type->name : "unknown"); + return -1; + } +else + { + write(fd, buffer, error.encoded); + printfd(__FILE__, "GetResponsePDU encoded successfully to %d bytes\n", + error.encoded); + } +return 0; +} + +int SendGetResponseErrorPDU(int fd, + const PDU_t * getRequest, + int errorStatus, + int errorIndex) +{ +asn_enc_rval_t error; +GetResponse_PDU_t msg; + +memset(&msg, 0, sizeof(msg)); + +msg.request_id = getRequest->request_id; +asn_long2INTEGER(&msg.error_status, errorStatus); +asn_long2INTEGER(&msg.error_index, errorIndex); + +char buffer[1024]; +error = der_encode_to_buffer(&asn_DEF_GetResponse_PDU, &msg, buffer, + sizeof(buffer)); + +if (error.encoded == -1) + { + printfd(__FILE__, "Could not encode GetResponsePDU for error (at %s)\n", + error.failed_type ? error.failed_type->name : "unknown"); + return -1; + } +else + { + write(fd, buffer, error.encoded); + printfd(__FILE__, + "GetResponsePDU for error encoded successfully to %d bytes\n", + error.encoded); + } +return 0; +}