22#include "oprs_protobuf.h"
24#include <core/exception.h>
25#include <plugins/openprs/mod_utils.h>
27#include <lisp-list_f-pub.h>
28#include <oprs-array_f-pub.h>
29#include <oprs-type_f-pub.h>
30#include <oprs_f-pub.h>
31#include <slistPack_f.h>
33using namespace oprs_protobuf;
35extern "C" void finalize();
40 fprintf(stderr, "Error: pb-setup has not been called\n"); \
48 fprintf(stderr, "Error: pb-setup has not been called\n"); \
57action_pb_setup(TermList terms)
59 int terms_len = sl_slist_length(terms);
62 "Error[pb-setup]: invalid number of "
63 "arguments: req 1, got %i\n",
68 Term *proto_paths = (Term *)get_list_pos(terms, 1);
69 if (proto_paths->type != LISP_LIST) {
70 fprintf(stderr,
"Error[pb-setup]: proto paths type is not a LISP_LIST\n");
75 for (L_List p_l = proto_paths->u.l_list; p_l; p_l = l_cdr(p_l)) {
77 if (t->type != STRING) {
78 fprintf(stderr,
"Error[pb-setup]: at least one proto path is not of type STRING\n");
84 std::vector<std::string> ppaths(num_paths);
86 for (L_List p_l = proto_paths->u.l_list; p_l; p_l = l_cdr(p_l)) {
88 ppaths[i++] = t->u.string;
91 for (
size_t i = 0; i < ppaths.size(); ++i) {
92 std::string::size_type pos;
93 if ((pos = ppaths[i].find(
"@BASEDIR@")) != std::string::npos) {
94 ppaths[i].replace(pos, 9, BASEDIR);
96 if ((pos = ppaths[i].find(
"@FAWKES_BASEDIR@")) != std::string::npos) {
97 ppaths[i].replace(pos, 16, FAWKES_BASEDIR);
99 if ((pos = ppaths[i].find(
"@RESDIR@")) != std::string::npos) {
100 ppaths[i].replace(pos, 8, RESDIR);
102 if ((pos = ppaths[i].find(
"@CONFDIR@")) != std::string::npos) {
103 ppaths[i].replace(pos, 9, CONFDIR);
105 if (ppaths[i][ppaths.size() - 1] !=
'/') {
117func_pb_create(TermList terms)
123 ACTION_ASSERT_ARG_LENGTH(
"pb-create", terms, 1);
124 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-create", type, terms, 1, STRING);
127 std::shared_ptr<google::protobuf::Message> *msg = g_oprs_pb->
oprs_create_msg(type->u.string);
129 Term *res = MAKE_OBJECT(Term);
130 res->type = U_POINTER;
131 res->u.u_pointer = msg;
133 }
catch (std::runtime_error &e) {
134 fprintf(stderr,
"Cannot create message of type %s: %s", type->u.string, e.what());
140action_pb_client_connect(TermList terms)
145 ACTION_ASSERT_ARG_LENGTH(
"pb-client-connect", terms, 2);
146 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-client-connect", host, terms, 1, STRING);
147 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-client-connect", port, terms, 2, LONG_LONG);
149 if (port->u.llintval < 0 || port->u.llintval > 65535) {
150 fprintf(stderr,
"Error[pb-client-connect]: invalid port %lli\n", port->u.llintval);
158action_pb_enable_server(TermList terms)
163 ACTION_ASSERT_ARG_LENGTH(
"pb-enable-server", terms, 1);
164 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-enable-server", port, terms, 1, LONG_LONG);
166 if (port->u.llintval < 0 || port->u.llintval > 65535) {
167 fprintf(stderr,
"Error[pb-enable-server]: invalid port %lli\n", port->u.llintval);
181action_pb_disable_server(TermList terms)
185 ACTION_ASSERT_ARG_LENGTH(
"pb-disable-server", terms, 0);
197action_pb_peer_create(TermList terms)
202 ACTION_ASSERT_ARG_LENGTH(
"pb-peer-create", terms, 2);
203 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create", host, terms, 1, STRING);
204 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create", port, terms, 2, LONG_LONG);
206 if (port->u.llintval < 0 || port->u.llintval > 65535) {
207 fprintf(stderr,
"Error[pb-peer-create]: invalid port %lli\n", port->u.llintval);
215action_pb_peer_create_local(TermList terms)
219 Term *host, *send_port, *recv_port;
220 ACTION_ASSERT_ARG_LENGTH(
"pb-peer-create-local", terms, 3);
221 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local", host, terms, 1, STRING);
222 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local", send_port, terms, 2, LONG_LONG);
223 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local", recv_port, terms, 3, LONG_LONG);
225 if (send_port->u.llintval < 0 || send_port->u.llintval > 65535) {
226 fprintf(stderr,
"Error[pb-peer-create-local]: invalid send port %lli\n", send_port->u.llintval);
229 if (recv_port->u.llintval < 0 || recv_port->u.llintval > 65535) {
230 fprintf(stderr,
"Error[pb-peer-create-local]: invalid recv port %lli\n", recv_port->u.llintval);
235 send_port->u.llintval,
236 recv_port->u.llintval);
240action_pb_peer_create_crypto(TermList terms)
244 Term *host, *port, *crypto_key, *cipher;
245 ACTION_ASSERT_ARG_LENGTH(
"pb-peer-create-local", terms, 4);
246 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-crypto", host, terms, 1, STRING);
247 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-crypto", port, terms, 2, LONG_LONG);
248 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-crypto", crypto_key, terms, 3, STRING);
249 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-crypto", cipher, terms, 4, STRING);
251 if (port->u.llintval < 0 || port->u.llintval > 65535) {
252 fprintf(stderr,
"Error[pb-peer-create-local]: invalid port %lli\n", port->u.llintval);
258 crypto_key->u.string,
263action_pb_peer_create_local_crypto(TermList terms)
267 Term *host, *send_port, *recv_port, *crypto_key, *cipher;
268 ACTION_ASSERT_ARG_LENGTH(
"pb-peer-create-local-crypto", terms, 5);
269 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local-crypto", host, terms, 1, STRING);
270 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local-crypto", send_port, terms, 2, LONG_LONG);
271 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local-crypto", recv_port, terms, 3, LONG_LONG);
272 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local-crypto", crypto_key, terms, 4, STRING);
273 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-create-local-crypto", cipher, terms, 5, STRING);
275 if (send_port->u.llintval < 0 || send_port->u.llintval > 65535) {
276 fprintf(stderr,
"Error[pb-peer-create-local]: invalid send port %lli\n", send_port->u.llintval);
279 if (recv_port->u.llintval < 0 || recv_port->u.llintval > 65535) {
280 fprintf(stderr,
"Error[pb-peer-create-local]: invalid recv port %lli\n", recv_port->u.llintval);
284 printf(
"Creating local peer. %s:%lli %lli %s %s\n",
286 send_port->u.llintval,
287 recv_port->u.llintval,
288 crypto_key->u.string,
291 send_port->u.llintval,
292 recv_port->u.llintval,
293 crypto_key->u.string,
298action_pb_peer_setup_crypto(TermList terms)
302 Term *peer_id, *crypto_key, *cipher;
303 ACTION_ASSERT_ARG_LENGTH(
"pb-peer-setup-crypto", terms, 4);
304 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-setup-crypto", peer_id, terms, 1, LONG_LONG);
305 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-setup-crypto", crypto_key, terms, 2, STRING);
306 ACTION_SET_AND_ASSERT_ARG_TYPE(
"pb-peer-setup-crypto", cipher, terms, 3, STRING);
310 crypto_key->u.string,
320pred_pb_events_pending(TermList terms)
328action_pb_process(TermList terms)
341#define PB_FIELD_ACCESSOR_FUNC(func_name, print_name) \
342 extern "C" Term *func_pb_##func_name(TermList terms) \
346 Term *msg, *field_name; \
347 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 2); \
348 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, msg, terms, 1, U_POINTER); \
349 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, field_name, terms, 2, STRING); \
351 return g_oprs_pb->oprs_pb_##func_name(msg->u.u_pointer, field_name->u.string); \
354#define PB_FIELD_ACCESSOR_PRED(func_name, print_name) \
355 extern "C" PBoolean pred_pb_##func_name(TermList terms) \
359 Term *msg, *field_name; \
360 ACTION_ASSERT_B_ARG_LENGTH(print_name, terms, 2); \
361 ACTION_SET_AND_ASSERT_B_ARG_TYPE(print_name, msg, terms, 1, U_POINTER); \
362 ACTION_SET_AND_ASSERT_B_ARG_TYPE(print_name, field_name, terms, 2, STRING); \
364 return g_oprs_pb->oprs_pb_##func_name(msg->u.u_pointer, field_name->u.string); \
367#define PB_MESSAGE_FUNC(func_name, print_name) \
368 extern "C" Term *func_pb_##func_name(TermList terms) \
373 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 1); \
374 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, msg, terms, 1, U_POINTER); \
376 return g_oprs_pb->oprs_pb_##func_name(msg->u.u_pointer); \
379#define PB_MESSAGE_ACTION(func_name, print_name) \
380 extern "C" Term *action_pb_##func_name(TermList terms) \
385 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 1); \
386 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, msg, terms, 1, U_POINTER); \
388 return g_oprs_pb->oprs_pb_##func_name(msg->u.u_pointer); \
391#define PB_CLIENT_MESSAGE_ACTION(func_name, print_name) \
392 extern "C" Term *action_pb_##func_name(TermList terms) \
396 Term *client_id, *msg; \
397 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 2); \
398 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, client_id, terms, 1, LONG_LONG); \
399 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, msg, terms, 2, U_POINTER); \
402 g_oprs_pb->oprs_pb_##func_name(client_id->u.llintval, msg->u.u_pointer); \
404 } catch (fawkes::Exception & e) { \
405 fprintf(stderr, "Error[%s]: %s\n", print_name, e.what_no_backtrace()); \
410#define PB_FIELD_SET_ACTION(func_name, print_name) \
411 extern "C" Term *action_pb_##func_name(TermList terms) \
415 Term *msg, *field_name, *value; \
416 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 3); \
417 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, msg, terms, 1, U_POINTER); \
418 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, field_name, terms, 2, STRING); \
419 value = (Term *)get_list_pos(terms, 3); \
422 g_oprs_pb->oprs_pb_##func_name(msg->u.u_pointer, field_name->u.string, value); \
424 } catch (fawkes::Exception & e) { \
425 fprintf(stderr, "Error[%s]: %s\n", print_name, e.what_no_backtrace()); \
430#define PB_CLIENT_ID_ACTION(func_name, print_name) \
431 extern "C" Term *action_pb_##func_name(TermList terms) \
436 ACTION_ASSERT_ARG_LENGTH(print_name, terms, 1); \
437 ACTION_SET_AND_ASSERT_ARG_TYPE(print_name, client_id, terms, 1, LONG_LONG); \
440 g_oprs_pb->oprs_pb_##func_name(client_id->u.llintval); \
442 } catch (fawkes::Exception & e) { \
444 "Error[pb-client-connect]: failed on " \
446 client_id->u.llintval); \
451PB_FIELD_ACCESSOR_FUNC(field_value,
"pb-field-value")
452PB_FIELD_ACCESSOR_FUNC(field_type, "pb-field-type")
453PB_FIELD_ACCESSOR_FUNC(field_label, "pb-field-label")
454PB_FIELD_ACCESSOR_FUNC(field_list, "pb-field-list")
456PB_FIELD_ACCESSOR_PRED(has_field, "pb-has-field")
457PB_FIELD_ACCESSOR_PRED(field_is_list, "pb-field-is-list")
459PB_MESSAGE_FUNC(field_names, "pb-field-names")
460PB_MESSAGE_FUNC(ref, "pb-ref")
461PB_MESSAGE_ACTION(destroy, "pb-destroy")
462PB_CLIENT_MESSAGE_ACTION(send, "pb-send")
463PB_CLIENT_MESSAGE_ACTION(broadcast, "pb-broadcast")
465PB_FIELD_SET_ACTION(set_field, "pb-set-field")
466PB_FIELD_SET_ACTION(add_list, "pb-add-list")
468PB_CLIENT_ID_ACTION(disconnect, "pb-disconnect")
469PB_CLIENT_ID_ACTION(peer_destroy, "pb-peer-destroy")
475 printf(
"*** LOADING mod_protobuf\n");
476 printf(
"Make sure your kernel calls pb-setup!\n");
478 make_and_declare_action(
"pb-setup", action_pb_setup, 1);
479 make_and_declare_action(
"pb-process", action_pb_process, 0);
480 make_and_declare_action(
"pb-destroy", action_pb_destroy, 1);
481 make_and_declare_action(
"pb-set-field", action_pb_set_field, 3);
482 make_and_declare_action(
"pb-add-list", action_pb_add_list, 3);
483 make_and_declare_action(
"pb-disconnect", action_pb_disconnect, 1);
484 make_and_declare_action(
"pb-peer-destroy", action_pb_peer_destroy, 1);
485 make_and_declare_action(
"pb-send", action_pb_send, 2);
486 make_and_declare_action(
"pb-broadcast", action_pb_broadcast, 2);
487 make_and_declare_action(
"pb-client-connect", action_pb_client_connect, 2);
488 make_and_declare_action(
"pb-enable-server", action_pb_enable_server, 1);
489 make_and_declare_action(
"pb-disable-server", action_pb_enable_server, 1);
490 make_and_declare_action(
"pb-peer-create", action_pb_peer_create, 2);
491 make_and_declare_action(
"pb-peer-create-local", action_pb_peer_create_local, 3);
492 make_and_declare_action(
"pb-peer-create-crypto", action_pb_peer_create_crypto, 4);
493 make_and_declare_action(
"pb-peer-create-local-crypto", action_pb_peer_create_local_crypto, 5);
494 make_and_declare_action(
"pb-peer-setup-crypto", action_pb_peer_setup_crypto, 3);
496 make_and_declare_eval_funct(
"pb-create", func_pb_create, 1);
497 make_and_declare_eval_funct(
"pb-field-names", func_pb_field_names, 1);
498 make_and_declare_eval_funct(
"pb-ref", func_pb_ref, 1);
499 make_and_declare_eval_funct(
"pb-field-value", func_pb_field_value, 2);
500 make_and_declare_eval_funct(
"pb-field-type", func_pb_field_type, 2);
501 make_and_declare_eval_funct(
"pb-field-label", func_pb_field_label, 2);
502 make_and_declare_eval_funct(
"pb-field-list", func_pb_field_list, 2);
504 make_and_declare_eval_pred(
"pb-has-field", pred_pb_has_field, 2, TRUE);
505 make_and_declare_eval_pred(
"pb-is-list", pred_pb_field_is_list, 2, TRUE);
506 make_and_declare_eval_pred(
"pb-events-pending", pred_pb_events_pending, 0, TRUE);
508 add_user_end_kernel_hook(finalize);
515 printf(
"*** DESTROYING mod_protobuf\n");
Base class for exceptions in Fawkes.
virtual const char * what_no_backtrace() const noexcept
Get primary string (does not implicitly print the back trace).
OpenPRS protobuf integration class.
Term * oprs_pb_peer_create_local_crypto(const std::string &host, int send_port, int recv_port, const std::string &crypto_key="", const std::string &cipher="")
Enable protobuf peer.
Term * oprs_pb_peer_create_local(const std::string &host, int send_port, int recv_port)
Enable protobuf peer.
Term * oprs_pb_peer_create_crypto(const std::string &host, int port, const std::string &crypto_key="", const std::string &cipher="")
Enable protobuf peer.
std::shared_ptr< google::protobuf::Message > * oprs_create_msg(std::string full_name)
Create a new message of given type.
void oprs_pb_process()
Process all pending events.
bool oprs_pb_events_pending()
Check if there are pending events.
void oprs_pb_disable_server()
Disable protobuf stream server.
void oprs_pb_enable_server(int port)
Enable protobuf stream server.
Term * oprs_pb_client_connect(std::string host, int port)
Connect as a client to the given server.
Term * oprs_pb_peer_create(const std::string &host, int port)
Enable protobuf peer.
void oprs_pb_peer_setup_crypto(long int peer_id, const std::string &crypto_key, const std::string &cipher)
Setup crypto for peer.