/* Send request and receive reply (gen_server client) */ int oe_send_request_and_receive_reply(CORBA_Environment *env) { int msgType = 0; erlang_msg msg; if (oe_send(env) < 0) return -1; do { if ((msgType = ei_receive_encoded(env->_fd, &env->_inbuf, &env->_inbufsz, &msg, &env->_iin)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Cannot decode message"); return -1; } } while (msgType != ERL_SEND && msgType != ERL_REG_SEND); /* Extracting return message header */ if (oe_prepare_reply_decoding(env) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad message"); return -1; } return 0; }
/* Client send message (Erlang distribution protocol) */ static int oe_send(CORBA_Environment *env) { if (strlen(env->_regname) == 0) { if (ei_send_encoded(env->_fd, env->_to_pid, env->_outbuf, env->_iout) < 0) { /* XXX Cannot send to peer? */ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot connect to server"); return -1; } } else { if (ei_send_reg_encoded(env->_fd, env->_from_pid, env->_regname, env->_outbuf, env->_iout) < 0) { /* XXX Cannot send to peer? */ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot connect to server"); return -1; } } return 0; }
int oe_ei_encode_list_header(CORBA_Environment *ev, int arity) { int size = ev->_iout + __OE_LISTHDRSZ__; if (size >= ev->_outbufsz) { char *buf = ev->_outbuf; int bufsz = ev->_outbufsz + ev->_memchunk; if ((buf = realloc(buf,bufsz)) != NULL) { ev->_outbuf = buf; ev->_outbufsz += ev->_memchunk; } else { CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding"); return -1; /* OUT OF MEMORY */ } } return ei_encode_list_header(ev->_outbuf, &ev->_iout, arity); }
int oe_ei_encode_ulong(CORBA_Environment *ev, unsigned long p) { int size = ev->_iout + __OE_ULONGSZ__; if (size >= ev->_outbufsz) { char *buf = ev->_outbuf; int bufsz = ev->_outbufsz + ev->_memchunk; if ((buf = realloc(buf,bufsz)) != NULL) { ev->_outbuf = buf; ev->_outbufsz += ev->_memchunk; } else { CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding"); return -1; /* OUT OF MEMORY */ } } return ei_encode_ulong(ev->_outbuf, &ev->_iout, p); }
int oe_ei_encode_longlong(CORBA_Environment *ev, CORBA_long_long p) { int size = ev->_iout + __OE_LONGLONGSZ__; if (size >= ev->_outbufsz) { char *buf = ev->_outbuf; int bufsz = ev->_outbufsz + ev->_memchunk; if ((buf = realloc(buf,bufsz)) != NULL) { ev->_outbuf = buf; ev->_outbufsz += ev->_memchunk; } else { CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding"); return -1; /* OUT OF MEMORY */ } } /* CORBA_long_long = long because of erl_interface limitation */ return ei_encode_long(ev->_outbuf, &ev->_iout, p); }
/* Generic server switch */ int oe_exec_switch(CORBA_Object obj, CORBA_Environment *env, oe_map_t *map) { /* Setting local variables */ int res = 0; int index = 0; /* XXX map may be NULL !! */ int length = map->length; char* op = env->_operation; PRINT_MAP("switching on map", map); /* Initiating exception indicator */ env->_major = CORBA_NO_EXCEPTION; if ((res = oe_prepare_request_decoding(env) < 0)) return res; #if defined(DEBUG_MAP) fprintf(stdout, "looking for operation: %s\n", op); fflush(stdout); #endif for (index = 0; index < length; index++) { #if defined(DEBUG_MAP) fprintf(stdout, "map->operations[%d].name: %s\n", index, map->operations[index].name); fflush(stdout); #endif if(strcmp(map->operations[index].name, op) == 0) { #if defined(DEBUG_MAP) fprintf(stdout, "calling map->operations[%d].function: 0x%X\n", index, map->operations[index].function); fflush(stdout); #endif return map->operations[index].function(obj, env); } } /* Bad call */ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, BAD_OPERATION, "Invalid operation"); return -1; }
int oe_ei_encode_port(CORBA_Environment *ev, const erlang_port *p) { int size = ev->_iout; ei_encode_port(NULL, &size, p); if (size >= ev->_outbufsz) { char *buf = ev->_outbuf; int bufsz = ev->_outbufsz + ev->_memchunk; while (size >= bufsz) bufsz += ev->_memchunk; if ((buf = realloc(buf, bufsz)) == NULL) { CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding"); return -1; /* OUT OF MEMORY */ } ev->_outbuf = buf; ev->_outbufsz = bufsz; } return ei_encode_port(ev->_outbuf, &ev->_iout, p); }
int oe_encode_erlang_binary(CORBA_Environment *ev, erlang_binary *binary) { int size = ev->_iout; ei_encode_binary(0, &size, binary->_buffer, binary->_length); if (size >= ev->_outbufsz) { char *buf = ev->_outbuf; int bufsz = ev->_outbufsz + ev->_memchunk; while (size >= bufsz) bufsz += ev->_memchunk; if ((buf = realloc(buf, bufsz)) == NULL) { CORBA_exc_set(ev, CORBA_SYSTEM_EXCEPTION, NO_MEMORY, "End of heap memory while encoding"); return -1; /* OUT OF MEMORY */ } ev->_outbuf = buf; ev->_outbufsz = bufsz; } return ei_encode_binary(ev->_outbuf, &ev->_iout, binary->_buffer, binary->_length); }
/* Prepare request decoding (gen_server server) */ int oe_prepare_request_decoding(CORBA_Environment *env) { char gencall_atom[10]; int error = 0; int version = 0; env->_iin = 0; env->_received = 0; memset(gencall_atom, 0, 10); ei_decode_version(env->_inbuf, &env->_iin, &version); ei_decode_tuple_header(env->_inbuf, &env->_iin, &env->_received); ei_decode_atom(env->_inbuf, &env->_iin, gencall_atom); if (strcmp(gencall_atom, "$gen_cast") == 0) { if ((error = ei_decode_atom(env->_inbuf, &env->_iin, env->_operation)) < 0) { ei_decode_tuple_header(env->_inbuf, &env->_iin, &env->_received); if ((error = ei_decode_atom(env->_inbuf, &env->_iin, env->_operation)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, BAD_OPERATION, "Bad Message, cannot extract operation"); return error; } env->_received -= 1; } else env->_received -= 2; return 0; } if (strcmp(gencall_atom, "$gen_call") == 0) { ei_decode_tuple_header(env->_inbuf, &env->_iin, &env->_received); if ((error = ei_decode_pid(env->_inbuf, &env->_iin, &env->_caller)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad Message, bad caller identity"); return error; } if ((error = ei_decode_ref(env->_inbuf, &env->_iin, &env->_unique)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad Message, bad message reference"); return error; } if ((error = ei_decode_atom(env->_inbuf, &env->_iin, env->_operation)) < 0) { ei_decode_tuple_header(env->_inbuf, &env->_iin, &env->_received); if ((error = ei_decode_atom(env->_inbuf, &env->_iin, env->_operation)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, BAD_OPERATION, "Bad Message, cannot extract operation"); return error; } env->_received -= 1; return 0; } else { env->_received -= 2; return 0; } } CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad message, neither cast nor call"); return -1; }