diff smpp-send/build_pdu.c @ 223:f11c3e40c87a

new program smpp-send
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 05 Aug 2023 12:24:31 -0800
parents
children 243ed87880a1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smpp-send/build_pdu.c	Sat Aug 05 12:24:31 2023 -0800
@@ -0,0 +1,90 @@
+/*
+ * The function in this module constructs SMPP submit_sm PDUs
+ * from input messages.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "error.h"
+
+extern char src_addr[21], dest_addr[21];
+extern u_char src_ton, src_npi, dest_ton, dest_npi;
+extern u_char esm_class, pid_byte, dcs_byte;
+extern u_char prio_flag, reg_deliv, replace_flag;
+
+extern int input_lineno;
+
+void
+build_submit_sm(payload, payload_len, udhi)
+	u_char *payload;
+	unsigned payload_len;
+{
+	u_char pdu[512], *dp, esm_class_inst;
+	unsigned pdu_len, slen;
+
+	/* sanity checks first */
+	if (!src_addr[0]) {
+		fprintf(stderr, ERR_PREFIX "src address is not set\n",
+			input_lineno);
+		exit(1);
+	}
+	if (!dest_addr[0]) {
+		fprintf(stderr, ERR_PREFIX "dest address is not set\n",
+			input_lineno);
+		exit(1);
+	}
+	/* proceed */
+	dp = pdu + 4;		/* length will be filled last */
+	/* command_id */
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0x04;		/* submit_sm */
+	/* empty command_status */
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0;
+	/* dummy sequence_number (will be overwritten by smpp-trx-sa) */
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0;
+	*dp++ = 0;
+	/* mandatory params */
+	*dp++ = 0;		/* empty service_type */
+	*dp++ = src_ton;
+	*dp++ = src_npi;
+	slen = strlen(src_addr) + 1;
+	bcopy(src_addr, dp, slen);
+	dp += slen;
+	*dp++ = dest_ton;
+	*dp++ = dest_npi;
+	slen = strlen(dest_addr) + 1;
+	bcopy(dest_addr, dp, slen);
+	dp += slen;
+	esm_class_inst = esm_class;
+	if (udhi)
+		esm_class_inst |= 0x40;
+	*dp++ = esm_class_inst;
+	*dp++ = pid_byte;
+	*dp++ = prio_flag;
+	*dp++ = 0;		/* empty schedule_delivery_time */
+	*dp++ = 0;		/* empty validity_period */
+	*dp++ = reg_deliv;
+	*dp++ = replace_flag;
+	*dp++ = dcs_byte;
+	*dp++ = 0;		/* no canned messages */
+	*dp++ = payload_len;
+	bcopy(payload, dp, payload_len);
+	dp += payload_len;
+	pdu_len = dp - pdu;
+	pdu[0] = pdu_len >> 24;
+	pdu[1] = pdu_len >> 16;
+	pdu[2] = pdu_len >> 8;
+	pdu[3] = pdu_len;
+	/* local datagram socket output to be implemented */
+	hex_dump_output(pdu, pdu_len);
+}