void* socktype_from_m(const mxArray* param) { int* output = NULL; char* name = NULL; const zmq_socket_type_t* sockType = NULL; output = (int*) mxCalloc(1, sizeof(int)); if (output == NULL) { mexErrMsgIdAndTxt("util:calloc", "Error: Unsuccessful memory allocation."); } name = (char*) str_from_m(param); if (name == NULL) return NULL; sockType = find_socket_type_by_name(name); if (sockType != NULL) *output = sockType->id; mxFree(name); return (void*) output; }
void* mechanism_from_m(const mxArray* param) { int* output = NULL; char* name = NULL; const zmq_sockopt_mechanism_t* mechanism = NULL; output = (int*) mxCalloc(1, sizeof(int)); if (output == NULL) { mexErrMsgIdAndTxt("util:calloc", "Error: Unsuccessful memory allocation."); } name = (char*) str_from_m(param); if (name == NULL) return NULL; mechanism = find_sockopt_mechanism_by_name(name); if (mechanism != NULL) *output = mechanism->id; mxFree(name); return (void*) output; }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { void* socket = NULL; char* option = NULL; void* optValue = NULL; size_t optLen; const zmq_sockopt_desc_t* optDesc = NULL; const zmq_sockopt_type_t* typeDesc = NULL; int rc; if (nrhs != 3) { mexErrMsgIdAndTxt("zmq:sockopts:invalidArgs", "Error: Tree arguments are required: socket, option, value"); return; } if (mxIsChar(prhs[1]) != 1) { mexErrMsgIdAndTxt("zmq:sockopts:invalidOptionName", "Error: option_name is not a string."); return; } if (mxGetM(prhs[1]) != 1) { mexErrMsgIdAndTxt("zmq:sockopts:optionNameNotRowVec", "Error: option_name is not a row vector."); return; } /* Discover which option should be used */ option = (char*) str_from_m(prhs[1]); if (option == NULL) return; optDesc = find_sockopt_by_name(option); if (optDesc == NULL) return; typeDesc = find_sockopt_type_by_id(optDesc->typeId); if (typeDesc == NULL) return; mxFree(option); socket = pointer_from_m(prhs[0]); if (socket == NULL) return; optValue = typeDesc->from_m(prhs[2]); if (optValue == NULL) return; optLen = typeDesc->maxLen; /* Correct len for compound types */ if (typeDesc->id == SOPT_STRING || typeDesc->id == SOPT_KEY) { optLen = strlen((char*) optValue)*sizeof(char); } rc = zmq_setsockopt(socket, optDesc->id, optValue, optLen); if (rc < 0) { handle_error(); mxFree(optValue); return; } plhs[0] = int_to_m((void*) &rc); mxFree(optValue); }