diff --git a/src/service.c b/src/service.c index f3345ea310a4712c882e59727307807e3f2acb57..697c193102615616f3e3b01efb505abca0af97b9 100644 --- a/src/service.c +++ b/src/service.c @@ -22,7 +22,12 @@ */ #include "service.h" + +#include "disconnect.h" #include "format.h" +#include "parse.h" +#include "ssh.h" +#include "xalloc.h" struct service_handler { @@ -42,7 +47,7 @@ static int do_service(struct packet_handler *c, struct service_handler *closure = (struct service_handler *) c; struct simple_buffer buffer; - UINT8 msg_number; + int msg_number; int name; MDEBUG(closure); @@ -60,19 +65,16 @@ static int do_service(struct packet_handler *c, || !(service = ALIST_GET(closure->services, name)) || !SERVICE_INIT(service, connection)) { - int res - = A_WRITE(c->write, + return (LSH_FAIL | LSH_CLOSE) + | A_WRITE(connection->write, format_disconnect(SSH_DISCONNECT_SERVICE_NOT_AVAILABLE, - "Service not available.\n")); - return (LSH_PROBLEMP(res) - ? LSH_FAIL | LSH_DIE - : LSH_FAIL | LSH_CLOSE); + "Service not available.", "")); } /* Don't accept any further service requests */ - connection->dispatch[SSH_SERVICE_REQUEST] + connection->dispatch[SSH_MSG_SERVICE_REQUEST] = connection->fail; - return A_WRITE(c->write(format_service_accept(name))); + return A_WRITE(connection->write, format_service_accept(name)); } return LSH_FAIL | LSH_DIE; } @@ -86,3 +88,34 @@ struct packet_handler *make_service_handler(struct alist *services) return &self->super; } + +struct meta_service +{ + struct ssh_service super; + + struct packet_handler *service_handler; +}; + +static int init_meta_service(struct ssh_service *c, + struct ssh_connection *connection) +{ + struct meta_service *closure = (struct meta_service *) c; + + MDEBUG(closure); + + connection->dispatch[SSH_MSG_SERVICE_REQUEST] = closure->service_handler; + + return LSH_OK | LSH_GOON; +} + +struct ssh_service *make_meta_service(struct alist *services) +{ + struct meta_service *self; + + NEW(self); + + self->super.init = init_meta_service; + self->service_handler = make_service_handler(services); + + return &self->super; +}