diff simtool/usersum.c @ 10:ddd767f6e15b

fc-simtool ported over
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Mar 2021 07:11:25 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simtool/usersum.c	Sun Mar 14 07:11:25 2021 +0000
@@ -0,0 +1,189 @@
+/*
+ * This module implements the user-sum (summary info) command.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "simresp.h"
+#include "curfile.h"
+#include "file_id.h"
+
+#define	SST_BYTES_USED	15
+
+static
+read_sst(sstbuf)
+	u_char *sstbuf;
+{
+	int rc;
+	unsigned rdlen;
+
+	rc = select_op(DF_GSM);
+	if (rc < 0)
+		return(rc);
+	rc = select_op(EF_SST);
+	if (rc < 0)
+		return(rc);
+	rc = parse_ef_select_response();
+	if (rc < 0)
+		return(rc);
+	if (curfile_structure != 0x00) {
+		fprintf(stderr, "error: EF_SST is not transparent\n");
+		return(-1);
+	}
+	if (curfile_total_size < 2) {
+		fprintf(stderr,
+		"error: EF_SST is shorter than spec minimum of 2 bytes\n");
+		return(-1);
+	}
+	rdlen = curfile_total_size;
+	if (rdlen > SST_BYTES_USED)
+		rdlen = SST_BYTES_USED;
+	rc = readbin_op(0, rdlen);
+	if (rc < 0)
+		return(rc);
+	bcopy(sim_resp_data, sstbuf, rdlen);
+	if (rdlen < SST_BYTES_USED)
+		bzero(sstbuf + rdlen, SST_BYTES_USED - rdlen);
+	return(0);
+}
+
+static
+do_phonebook_file(file_id, ef_name, book_name, outf)
+	unsigned file_id;
+	char *ef_name, *book_name;
+	FILE *outf;
+{
+	int rc;
+
+	rc = select_op(file_id);
+	if (rc < 0)
+		return(rc);
+	rc = parse_ef_select_response();
+	if (rc < 0)
+		return(rc);
+	if (curfile_structure != 0x01 && curfile_structure != 0x03) {
+		fprintf(stderr, "error: %s is not record-structured\n",
+			ef_name);
+		return(-1);
+	}
+	if (curfile_record_len < 14) {
+		fprintf(stderr,
+	"error: %s has record length of %u bytes, less than minimum 14\n",
+			ef_name, curfile_record_len);
+		return(-1);
+	}
+	fprintf(outf, "%s: %u entries, %u bytes of alpha tag\n", book_name,
+		curfile_record_count, curfile_record_len - 14);
+	return(0);
+}
+
+static
+do_sms_store(outf)
+	FILE *outf;
+{
+	int rc;
+
+	rc = select_op(EF_SMS);
+	if (rc < 0)
+		return(rc);
+	rc = parse_ef_select_response();
+	if (rc < 0)
+		return(rc);
+	if (curfile_structure != 0x01 || curfile_record_len != 176) {
+		fprintf(stderr,
+		"error: EF_SMS is not linear fixed with 176-byte records\n");
+		return(-1);
+	}
+	fprintf(outf, "SMS store: %u entries\n", curfile_record_count);
+	return(0);
+}
+
+static
+do_smsp_store(outf)
+	FILE *outf;
+{
+	int rc;
+
+	rc = select_op(EF_SMSP);
+	if (rc < 0)
+		return(rc);
+	rc = parse_ef_select_response();
+	if (rc < 0)
+		return(rc);
+	if (curfile_structure != 0x01) {
+		fprintf(stderr, "error: EF_SMSP is not linear fixed\n");
+		return(-1);
+	}
+	if (curfile_record_len < 28) {
+		fprintf(stderr,
+	"error: EF_SMSP has record length of %u bytes, less than minimum 14\n",
+			curfile_record_len);
+		return(-1);
+	}
+	fprintf(outf,
+		"SMS parameter store: %u entries, %u bytes of alpha tag\n",
+		curfile_record_count, curfile_record_len - 28);
+	return(0);
+}
+
+cmd_user_sum(argc, argv, outf)
+	char **argv;
+	FILE *outf;
+{
+	int rc;
+	u_char sst[SST_BYTES_USED];
+
+	rc = read_sst(sst);
+	if (rc < 0)
+		return(rc);
+	rc = select_op(DF_TELECOM);
+	if (rc < 0)
+		return(rc);
+	if ((sst[0] & 0x0C) == 0x0C) {
+		rc = do_phonebook_file(EF_ADN, "EF_ADN", "ADN phonebook", outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[0] & 0x30) == 0x30) {
+		rc = do_phonebook_file(EF_FDN, "EF_FDN", "FDN phonebook", outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[0] & 0xC0) == 0xC0) {
+		rc = do_sms_store(outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[1] & 0x03) == 0x03)
+		fprintf(outf, "AoC service present\n");
+	if ((sst[2] & 0x03) == 0x03) {
+		rc = do_phonebook_file(EF_MSISDN, "EF_MSISDN", "MSISDN record",
+					outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[2] & 0xC0) == 0xC0) {
+		rc = do_smsp_store(outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[3] & 0x03) == 0x03) {
+		rc = do_phonebook_file(EF_LND, "EF_LND", "LND cyclic store",
+					outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[4] & 0x0C) == 0x0C) {
+		rc = do_phonebook_file(EF_SDN, "EF_SDN", "SDN phonebook", outf);
+		if (rc < 0)
+			return(rc);
+	}
+	if ((sst[13] & 0x03) == 0x03)
+		fprintf(outf, "MBDN present\n");
+	if ((sst[13] & 0x0C) == 0x0C)
+		fprintf(outf, "MWIS present\n");
+	return(0);
+}