summaryrefslogtreecommitdiffstats
path: root/lib/ptm_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ptm_lib.c')
-rw-r--r--lib/ptm_lib.c800
1 files changed, 394 insertions, 406 deletions
diff --git a/lib/ptm_lib.c b/lib/ptm_lib.c
index 7181e2d89..f50d1e298 100644
--- a/lib/ptm_lib.c
+++ b/lib/ptm_lib.c
@@ -32,445 +32,433 @@
#define DEBUG_E 0
#define DEBUG_V 0
-#define ERRLOG(fmt, ...) \
- do { if (DEBUG_E) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
- __LINE__, __func__, ##__VA_ARGS__); } while (0)
-
-#define DLOG(fmt, ...) \
- do { if (DEBUG_V) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
- __LINE__, __func__, ##__VA_ARGS__); } while (0)
+#define ERRLOG(fmt, ...) \
+ do { \
+ if (DEBUG_E) \
+ fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
+ __LINE__, __func__, ##__VA_ARGS__); \
+ } while (0)
+
+#define DLOG(fmt, ...) \
+ do { \
+ if (DEBUG_V) \
+ fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
+ __LINE__, __func__, ##__VA_ARGS__); \
+ } while (0)
typedef struct ptm_lib_msg_ctxt_s {
- int cmd_id;
- csv_t *csv;
- ptmlib_msg_type type;
+ int cmd_id;
+ csv_t *csv;
+ ptmlib_msg_type type;
} ptm_lib_msg_ctxt_t;
-static csv_record_t *
-_ptm_lib_encode_header(csv_t *csv,
- csv_record_t *rec,
- int msglen,
- int version,
- int type,
- int cmd_id,
- char *client_name)
+static csv_record_t *_ptm_lib_encode_header(csv_t *csv, csv_record_t *rec,
+ int msglen, int version, int type,
+ int cmd_id, char *client_name)
{
- char msglen_buf[16], vers_buf[16], type_buf[16], cmdid_buf[16];
- char client_buf[32];
- csv_record_t *rec1;
-
- sprintf(msglen_buf, "%4u", msglen);
- sprintf(vers_buf, "%4u", version);
- sprintf(type_buf, "%4u", type);
- sprintf(cmdid_buf, "%4u", cmd_id);
- snprintf(client_buf, 17, "%16.16s", client_name);
- if (rec) {
- rec1 = csv_encode_record(csv, rec, 5, msglen_buf, vers_buf,
- type_buf, cmdid_buf, client_buf);
- } else {
- rec1 = csv_encode(csv, 5, msglen_buf, vers_buf,
- type_buf, cmdid_buf, client_buf);
- }
- return (rec1);
+ char msglen_buf[16], vers_buf[16], type_buf[16], cmdid_buf[16];
+ char client_buf[32];
+ csv_record_t *rec1;
+
+ sprintf(msglen_buf, "%4u", msglen);
+ sprintf(vers_buf, "%4u", version);
+ sprintf(type_buf, "%4u", type);
+ sprintf(cmdid_buf, "%4u", cmd_id);
+ snprintf(client_buf, 17, "%16.16s", client_name);
+ if (rec) {
+ rec1 = csv_encode_record(csv, rec, 5, msglen_buf, vers_buf,
+ type_buf, cmdid_buf, client_buf);
+ } else {
+ rec1 = csv_encode(csv, 5, msglen_buf, vers_buf, type_buf,
+ cmdid_buf, client_buf);
+ }
+ return (rec1);
}
-static int
-_ptm_lib_decode_header (csv_t *csv,
- int *msglen,
- int *version,
- int *type,
- int *cmd_id,
- char *client_name)
+static int _ptm_lib_decode_header(csv_t *csv, int *msglen, int *version,
+ int *type, int *cmd_id, char *client_name)
{
- char *hdr;
- csv_record_t *rec;
- csv_field_t *fld;
- int i, j;
-
- csv_decode(csv, NULL);
- rec = csv_record_iter(csv);
- if (rec == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- hdr = csv_field_iter(rec, &fld);
- if (hdr == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- *msglen = atoi(hdr);
- hdr = csv_field_iter_next(&fld);
- if (hdr == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- *version = atoi(hdr);
- hdr = csv_field_iter_next(&fld);
- if (hdr == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- *type = atoi(hdr);
- hdr = csv_field_iter_next(&fld);
- if (hdr == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- *cmd_id = atoi(hdr);
- hdr = csv_field_iter_next(&fld);
- if (hdr == NULL) {
- DLOG("malformed CSV\n");
- return (-1);
- }
- /* remove leading spaces */
- for (i = j = 0; i < csv_field_len(fld); i++) {
- if (!isspace(hdr[i])) {
- client_name[j] = hdr[i];
- j++;
- }
- }
- client_name[j] = '\0';
-
- return (0);
+ char *hdr;
+ csv_record_t *rec;
+ csv_field_t *fld;
+ int i, j;
+
+ csv_decode(csv, NULL);
+ rec = csv_record_iter(csv);
+ if (rec == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ hdr = csv_field_iter(rec, &fld);
+ if (hdr == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ *msglen = atoi(hdr);
+ hdr = csv_field_iter_next(&fld);
+ if (hdr == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ *version = atoi(hdr);
+ hdr = csv_field_iter_next(&fld);
+ if (hdr == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ *type = atoi(hdr);
+ hdr = csv_field_iter_next(&fld);
+ if (hdr == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ *cmd_id = atoi(hdr);
+ hdr = csv_field_iter_next(&fld);
+ if (hdr == NULL) {
+ DLOG("malformed CSV\n");
+ return (-1);
+ }
+ /* remove leading spaces */
+ for (i = j = 0; i < csv_field_len(fld); i++) {
+ if (!isspace(hdr[i])) {
+ client_name[j] = hdr[i];
+ j++;
+ }
+ }
+ client_name[j] = '\0';
+
+ return (0);
}
-int
-ptm_lib_append_msg(ptm_lib_handle_t *hdl, void *ctxt,
- const char *key, const char *val)
+int ptm_lib_append_msg(ptm_lib_handle_t *hdl, void *ctxt, const char *key,
+ const char *val)
{
- ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
- csv_t *csv;
- csv_record_t *mh_rec, *rec;
-
- if (!p_ctxt) {
- ERRLOG("%s: no context \n", __FUNCTION__);
- return -1;
- }
-
- csv = p_ctxt->csv;
- mh_rec = csv_record_iter(csv);
- rec = csv_record_iter_next(mh_rec);
-
- /* append to the hdr record */
- rec = csv_append_record(csv, rec, 1, key);
- if (!rec) {
- ERRLOG("%s: Could not append key \n", __FUNCTION__);
- return -1;
- }
-
- rec = csv_record_iter_next(rec);
- /* append to the data record */
- rec = csv_append_record(csv, rec, 1, val);
- if (!rec) {
- ERRLOG("%s: Could not append val \n", __FUNCTION__);
- return -1;
- }
-
- /* update the msg hdr */
- _ptm_lib_encode_header(csv, mh_rec,
- (csvlen(csv) - PTMLIB_MSG_HDR_LEN),
- PTMLIB_MSG_VERSION, p_ctxt->type,
- p_ctxt->cmd_id, hdl->client_name);
-
- return 0;
+ ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
+ csv_t *csv;
+ csv_record_t *mh_rec, *rec;
+
+ if (!p_ctxt) {
+ ERRLOG("%s: no context \n", __FUNCTION__);
+ return -1;
+ }
+
+ csv = p_ctxt->csv;
+ mh_rec = csv_record_iter(csv);
+ rec = csv_record_iter_next(mh_rec);
+
+ /* append to the hdr record */
+ rec = csv_append_record(csv, rec, 1, key);
+ if (!rec) {
+ ERRLOG("%s: Could not append key \n", __FUNCTION__);
+ return -1;
+ }
+
+ rec = csv_record_iter_next(rec);
+ /* append to the data record */
+ rec = csv_append_record(csv, rec, 1, val);
+ if (!rec) {
+ ERRLOG("%s: Could not append val \n", __FUNCTION__);
+ return -1;
+ }
+
+ /* update the msg hdr */
+ _ptm_lib_encode_header(csv, mh_rec, (csvlen(csv) - PTMLIB_MSG_HDR_LEN),
+ PTMLIB_MSG_VERSION, p_ctxt->type, p_ctxt->cmd_id,
+ hdl->client_name);
+
+ return 0;
}
-int
-ptm_lib_init_msg(ptm_lib_handle_t *hdl, int cmd_id, int type,
- void *in_ctxt, void **out_ctxt)
+int ptm_lib_init_msg(ptm_lib_handle_t *hdl, int cmd_id, int type, void *in_ctxt,
+ void **out_ctxt)
{
- ptm_lib_msg_ctxt_t *p_ctxt;
- ptm_lib_msg_ctxt_t *p_in_ctxt = in_ctxt;
- csv_t *csv;
- csv_record_t *rec, *d_rec;
-
- /* Initialize csv for using discrete record buffers */
- csv = csv_init(NULL, NULL, PTMLIB_MSG_SZ);
-
- if (!csv) {
- ERRLOG("%s: Could not allocate csv \n", __FUNCTION__);
- return -1;
- }
-
- rec = _ptm_lib_encode_header(csv, NULL, 0,
- PTMLIB_MSG_VERSION, type,
- cmd_id, hdl->client_name);
-
- if (!rec) {
- ERRLOG("%s: Could not allocate record \n", __FUNCTION__);
- csv_clean(csv);
- csv_free(csv);
- return -1;
- }
-
- p_ctxt = calloc(1, sizeof(*p_ctxt));
- if (!p_ctxt) {
- ERRLOG("%s: Could not allocate context \n", __FUNCTION__);
- csv_clean(csv);
- csv_free(csv);
- return -1;
- }
-
- p_ctxt->csv = csv;
- p_ctxt->cmd_id = cmd_id;
- p_ctxt->type = type;
-
- *(ptm_lib_msg_ctxt_t **)out_ctxt = p_ctxt;
-
- /* caller supplied a context to initialize with? */
- if (p_in_ctxt) {
- /* insert the hdr rec */
- rec = csv_record_iter(p_in_ctxt->csv);
- csv_clone_record (p_in_ctxt->csv, rec, &d_rec);
- csv_insert_record (csv, d_rec);
- /* insert the data rec */
- rec = csv_record_iter_next(rec);
- csv_clone_record (p_in_ctxt->csv, rec, &d_rec);
- csv_insert_record (csv, d_rec);
- }
- return 0;
+ ptm_lib_msg_ctxt_t *p_ctxt;
+ ptm_lib_msg_ctxt_t *p_in_ctxt = in_ctxt;
+ csv_t *csv;
+ csv_record_t *rec, *d_rec;
+
+ /* Initialize csv for using discrete record buffers */
+ csv = csv_init(NULL, NULL, PTMLIB_MSG_SZ);
+
+ if (!csv) {
+ ERRLOG("%s: Could not allocate csv \n", __FUNCTION__);
+ return -1;
+ }
+
+ rec = _ptm_lib_encode_header(csv, NULL, 0, PTMLIB_MSG_VERSION, type,
+ cmd_id, hdl->client_name);
+
+ if (!rec) {
+ ERRLOG("%s: Could not allocate record \n", __FUNCTION__);
+ csv_clean(csv);
+ csv_free(csv);
+ return -1;
+ }
+
+ p_ctxt = calloc(1, sizeof(*p_ctxt));
+ if (!p_ctxt) {
+ ERRLOG("%s: Could not allocate context \n", __FUNCTION__);
+ csv_clean(csv);
+ csv_free(csv);
+ return -1;
+ }
+
+ p_ctxt->csv = csv;
+ p_ctxt->cmd_id = cmd_id;
+ p_ctxt->type = type;
+
+ *(ptm_lib_msg_ctxt_t **)out_ctxt = p_ctxt;
+
+ /* caller supplied a context to initialize with? */
+ if (p_in_ctxt) {
+ /* insert the hdr rec */
+ rec = csv_record_iter(p_in_ctxt->csv);
+ csv_clone_record(p_in_ctxt->csv, rec, &d_rec);
+ csv_insert_record(csv, d_rec);
+ /* insert the data rec */
+ rec = csv_record_iter_next(rec);
+ csv_clone_record(p_in_ctxt->csv, rec, &d_rec);
+ csv_insert_record(csv, d_rec);
+ }
+ return 0;
}
-int
-ptm_lib_complete_msg(ptm_lib_handle_t *hdl, void *ctxt,
- char *buf, int *len)
+int ptm_lib_complete_msg(ptm_lib_handle_t *hdl, void *ctxt, char *buf, int *len)
{
- ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
- csv_t *csv;
- csv_record_t *rec;
-
- if (!p_ctxt) {
- ERRLOG("%s: no context \n", __FUNCTION__);
- return -1;
- }
-
- csv = p_ctxt->csv;
- rec = csv_record_iter(csv);
-
- _ptm_lib_encode_header(csv, rec,
- (csvlen(csv) - PTMLIB_MSG_HDR_LEN),
- PTMLIB_MSG_VERSION, p_ctxt->type,
- p_ctxt->cmd_id, hdl->client_name);
-
- /* parse csv contents into string */
- if (buf && len) {
- if (csv_serialize(csv, buf, *len)) {
- ERRLOG("%s: cannot serialize\n", __FUNCTION__);
- return -1;
- }
- *len = csvlen(csv);
- }
-
- csv_clean(csv);
- csv_free(csv);
- free(p_ctxt);
-
- return 0;
+ ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
+ csv_t *csv;
+ csv_record_t *rec;
+
+ if (!p_ctxt) {
+ ERRLOG("%s: no context \n", __FUNCTION__);
+ return -1;
+ }
+
+ csv = p_ctxt->csv;
+ rec = csv_record_iter(csv);
+
+ _ptm_lib_encode_header(csv, rec, (csvlen(csv) - PTMLIB_MSG_HDR_LEN),
+ PTMLIB_MSG_VERSION, p_ctxt->type, p_ctxt->cmd_id,
+ hdl->client_name);
+
+ /* parse csv contents into string */
+ if (buf && len) {
+ if (csv_serialize(csv, buf, *len)) {
+ ERRLOG("%s: cannot serialize\n", __FUNCTION__);
+ return -1;
+ }
+ *len = csvlen(csv);
+ }
+
+ csv_clean(csv);
+ csv_free(csv);
+ free(p_ctxt);
+
+ return 0;
}
-int
-ptm_lib_find_key_in_msg(void *ctxt, const char *key, char *val)
+int ptm_lib_find_key_in_msg(void *ctxt, const char *key, char *val)
{
- ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
- csv_t *csv = p_ctxt->csv;
- csv_record_t *hrec, *drec;
- csv_field_t *hfld, *dfld;
- char *hstr, *dstr;
-
- /**
- * skip over ptm hdr if present
- * The next hdr is the keys (column name)
- * The next hdr is the data
- */
- if (csv_num_records(csv) > 2) {
- hrec = csv_record_iter(csv);
- hrec = csv_record_iter_next(hrec);
- } else {
- hrec = csv_record_iter(csv);
- }
- drec = csv_record_iter_next(hrec);
- val[0] = '\0';
- for(hstr = csv_field_iter(hrec, &hfld),
- dstr = csv_field_iter(drec, &dfld);
- (hstr && dstr);
- hstr = csv_field_iter_next(&hfld),
- dstr = csv_field_iter_next(&dfld)) {
- if (!strncmp(hstr, key, csv_field_len(hfld))) {
- snprintf(val, csv_field_len(dfld)+1, "%s", dstr);
- return 0;
- }
- }
-
- return -1;
+ ptm_lib_msg_ctxt_t *p_ctxt = ctxt;
+ csv_t *csv = p_ctxt->csv;
+ csv_record_t *hrec, *drec;
+ csv_field_t *hfld, *dfld;
+ char *hstr, *dstr;
+
+ /**
+ * skip over ptm hdr if present
+ * The next hdr is the keys (column name)
+ * The next hdr is the data
+ */
+ if (csv_num_records(csv) > 2) {
+ hrec = csv_record_iter(csv);
+ hrec = csv_record_iter_next(hrec);
+ } else {
+ hrec = csv_record_iter(csv);
+ }
+ drec = csv_record_iter_next(hrec);
+ val[0] = '\0';
+ for (hstr = csv_field_iter(hrec, &hfld),
+ dstr = csv_field_iter(drec, &dfld);
+ (hstr && dstr); hstr = csv_field_iter_next(&hfld),
+ dstr = csv_field_iter_next(&dfld)) {
+ if (!strncmp(hstr, key, csv_field_len(hfld))) {
+ snprintf(val, csv_field_len(dfld) + 1, "%s", dstr);
+ return 0;
+ }
+ }
+
+ return -1;
}
-static int
-_ptm_lib_read_ptm_socket(int fd, char *buf, int len)
+static int _ptm_lib_read_ptm_socket(int fd, char *buf, int len)
{
- int retries = 0, rc;
- int bytes_read = 0;
-
- while (bytes_read != len) {
- rc = recv(fd, (void *) (buf + bytes_read), (len - bytes_read),
- MSG_DONTWAIT);
- if (rc <= 0) {
- if (errno && (errno != EAGAIN) && (errno != EWOULDBLOCK)) {
- ERRLOG("fatal recv error(%s), closing connection, rc %d\n",
- strerror(errno), rc);
- return (rc);
- } else {
- if (retries++ < 2) {
- usleep(10000);
- continue;
- }
- DLOG("max retries - recv error(%d - %s) bytes read %d (%d)\n",
- errno, strerror(errno), bytes_read, len);
- return (bytes_read);
- }
- break;
- } else {
- bytes_read += rc;
- }
- }
-
- return bytes_read;
+ int retries = 0, rc;
+ int bytes_read = 0;
+
+ while (bytes_read != len) {
+ rc = recv(fd, (void *)(buf + bytes_read), (len - bytes_read),
+ MSG_DONTWAIT);
+ if (rc <= 0) {
+ if (errno && (errno != EAGAIN)
+ && (errno != EWOULDBLOCK)) {
+ ERRLOG("fatal recv error(%s), closing connection, rc %d\n",
+ strerror(errno), rc);
+ return (rc);
+ } else {
+ if (retries++ < 2) {
+ usleep(10000);
+ continue;
+ }
+ DLOG("max retries - recv error(%d - %s) bytes read %d (%d)\n",
+ errno, strerror(errno), bytes_read, len);
+ return (bytes_read);
+ }
+ break;
+ } else {
+ bytes_read += rc;
+ }
+ }
+
+ return bytes_read;
}
-int
-ptm_lib_process_msg(ptm_lib_handle_t *hdl, int fd,
- char *inbuf, int inlen, void *arg)
+int ptm_lib_process_msg(ptm_lib_handle_t *hdl, int fd, char *inbuf, int inlen,
+ void *arg)
{
- int rc, len;
- char client_name[32];
- int cmd_id, type, ver, msglen;
- csv_t *csv;
- ptm_lib_msg_ctxt_t *p_ctxt;
-
- len = _ptm_lib_read_ptm_socket(fd, inbuf, PTMLIB_MSG_HDR_LEN);
- if (len <= 0)
- return (len);
-
- csv = csv_init(NULL, inbuf, PTMLIB_MSG_HDR_LEN);
-
- if (!csv) {
- DLOG("Cannot allocate csv for hdr\n");
- return (-1);
- }
-
- rc = _ptm_lib_decode_header(csv, &msglen, &ver, &type, &cmd_id, client_name);
-
- csv_clean(csv);
- csv_free(csv);
-
- if (rc < 0) {
- /* could not decode the CSV - maybe its legacy cmd?
- * get the entire cmd from the socket and see if we can process it
- */
- if (len == PTMLIB_MSG_HDR_LEN) {
- len += _ptm_lib_read_ptm_socket(fd, (inbuf+PTMLIB_MSG_HDR_LEN),
- inlen - PTMLIB_MSG_HDR_LEN);
- if (len <= 0)
- return (len);
- }
-
- inbuf[len] = '\0';
- /* we only support the get-status cmd */
- if (strcmp(inbuf, PTMLIB_CMD_GET_STATUS)) {
- DLOG("unsupported legacy cmd %s\n", inbuf);
- return (-1);
- }
- /* internally create a csv-style cmd */
- ptm_lib_init_msg(hdl, 0, PTMLIB_MSG_TYPE_CMD, NULL, (void *)&p_ctxt);
- if (!p_ctxt) {
- DLOG("couldnt allocate context\n");
- return (-1);
- }
- ptm_lib_append_msg(hdl, p_ctxt, "cmd", PTMLIB_CMD_GET_STATUS);
-
- } else {
-
- if (msglen > inlen) {
- DLOG("msglen [%d] > inlen [%d]\n", msglen, inlen);
- return -1;
- }
-
- /* read the rest of the msg */
- len = _ptm_lib_read_ptm_socket(fd, inbuf, msglen);
- if (len <= 0) {
- return (len);
- }
-
- inbuf[len] = '\0';
-
- csv = csv_init(NULL, NULL, PTMLIB_MSG_SZ);
- if (!csv) {
- ERRLOG("Cannot allocate csv for msg\n");
- return -1;
- }
-
- csv_decode(csv, inbuf);
- p_ctxt = calloc(1, sizeof(*p_ctxt));
- if (!p_ctxt) {
- ERRLOG("%s: Could not allocate context \n", __FUNCTION__);
- csv_clean(csv);
- csv_free(csv);
- return -1;
- }
-
- p_ctxt->csv = csv;
- p_ctxt->cmd_id = cmd_id;
- p_ctxt->type = type;
- }
-
- switch(p_ctxt->type) {
- case PTMLIB_MSG_TYPE_NOTIFICATION:
- if (hdl->notify_cb)
- hdl->notify_cb(arg, p_ctxt);
- break;
- case PTMLIB_MSG_TYPE_CMD:
- if (hdl->cmd_cb)
- hdl->cmd_cb(arg, p_ctxt);
- break;
- case PTMLIB_MSG_TYPE_RESPONSE:
- if (hdl->response_cb)
- hdl->response_cb(arg, p_ctxt);
- break;
- default:
- return -1;
- }
-
- csv_clean(p_ctxt->csv);
- csv_free(p_ctxt->csv);
- free(p_ctxt);
-
- return len;
+ int rc, len;
+ char client_name[32];
+ int cmd_id, type, ver, msglen;
+ csv_t *csv;
+ ptm_lib_msg_ctxt_t *p_ctxt;
+
+ len = _ptm_lib_read_ptm_socket(fd, inbuf, PTMLIB_MSG_HDR_LEN);
+ if (len <= 0)
+ return (len);
+
+ csv = csv_init(NULL, inbuf, PTMLIB_MSG_HDR_LEN);
+
+ if (!csv) {
+ DLOG("Cannot allocate csv for hdr\n");
+ return (-1);
+ }
+
+ rc = _ptm_lib_decode_header(csv, &msglen, &ver, &type, &cmd_id,
+ client_name);
+
+ csv_clean(csv);
+ csv_free(csv);
+
+ if (rc < 0) {
+ /* could not decode the CSV - maybe its legacy cmd?
+ * get the entire cmd from the socket and see if we can process
+ * it
+ */
+ if (len == PTMLIB_MSG_HDR_LEN) {
+ len += _ptm_lib_read_ptm_socket(
+ fd, (inbuf + PTMLIB_MSG_HDR_LEN),
+ inlen - PTMLIB_MSG_HDR_LEN);
+ if (len <= 0)
+ return (len);
+ }
+
+ inbuf[len] = '\0';
+ /* we only support the get-status cmd */
+ if (strcmp(inbuf, PTMLIB_CMD_GET_STATUS)) {
+ DLOG("unsupported legacy cmd %s\n", inbuf);
+ return (-1);
+ }
+ /* internally create a csv-style cmd */
+ ptm_lib_init_msg(hdl, 0, PTMLIB_MSG_TYPE_CMD, NULL,
+ (void *)&p_ctxt);
+ if (!p_ctxt) {
+ DLOG("couldnt allocate context\n");
+ return (-1);
+ }
+ ptm_lib_append_msg(hdl, p_ctxt, "cmd", PTMLIB_CMD_GET_STATUS);
+
+ } else {
+
+ if (msglen > inlen) {
+ DLOG("msglen [%d] > inlen [%d]\n", msglen, inlen);
+ return -1;
+ }
+
+ /* read the rest of the msg */
+ len = _ptm_lib_read_ptm_socket(fd, inbuf, msglen);
+ if (len <= 0) {
+ return (len);
+ }
+
+ inbuf[len] = '\0';
+
+ csv = csv_init(NULL, NULL, PTMLIB_MSG_SZ);
+ if (!csv) {
+ ERRLOG("Cannot allocate csv for msg\n");
+ return -1;
+ }
+
+ csv_decode(csv, inbuf);
+ p_ctxt = calloc(1, sizeof(*p_ctxt));
+ if (!p_ctxt) {
+ ERRLOG("%s: Could not allocate context \n",
+ __FUNCTION__);
+ csv_clean(csv);
+ csv_free(csv);
+ return -1;
+ }
+
+ p_ctxt->csv = csv;
+ p_ctxt->cmd_id = cmd_id;
+ p_ctxt->type = type;
+ }
+
+ switch (p_ctxt->type) {
+ case PTMLIB_MSG_TYPE_NOTIFICATION:
+ if (hdl->notify_cb)
+ hdl->notify_cb(arg, p_ctxt);
+ break;
+ case PTMLIB_MSG_TYPE_CMD:
+ if (hdl->cmd_cb)
+ hdl->cmd_cb(arg, p_ctxt);
+ break;
+ case PTMLIB_MSG_TYPE_RESPONSE:
+ if (hdl->response_cb)
+ hdl->response_cb(arg, p_ctxt);
+ break;
+ default:
+ return -1;
+ }
+
+ csv_clean(p_ctxt->csv);
+ csv_free(p_ctxt->csv);
+ free(p_ctxt);
+
+ return len;
}
-ptm_lib_handle_t *
-ptm_lib_register(char *client_name,
- ptm_cmd_cb cmd_cb,
- ptm_notify_cb notify_cb,
- ptm_response_cb response_cb)
+ptm_lib_handle_t *ptm_lib_register(char *client_name, ptm_cmd_cb cmd_cb,
+ ptm_notify_cb notify_cb,
+ ptm_response_cb response_cb)
{
- ptm_lib_handle_t *hdl;
+ ptm_lib_handle_t *hdl;
- hdl = calloc(1, sizeof(*hdl));
+ hdl = calloc(1, sizeof(*hdl));
- if (hdl) {
- strncpy(hdl->client_name, client_name, PTMLIB_MAXNAMELEN - 1);
- hdl->cmd_cb = cmd_cb;
- hdl->notify_cb = notify_cb;
- hdl->response_cb = response_cb;
- }
+ if (hdl) {
+ strncpy(hdl->client_name, client_name, PTMLIB_MAXNAMELEN - 1);
+ hdl->cmd_cb = cmd_cb;
+ hdl->notify_cb = notify_cb;
+ hdl->response_cb = response_cb;
+ }
- return hdl;
+ return hdl;
}
-void
-ptm_lib_deregister(ptm_lib_handle_t *hdl)
+void ptm_lib_deregister(ptm_lib_handle_t *hdl)
{
- if (hdl) {
- memset(hdl, 0x00, sizeof(*hdl));
- free(hdl);
- }
+ if (hdl) {
+ memset(hdl, 0x00, sizeof(*hdl));
+ free(hdl);
+ }
}