diff libutil/plmnlist.c @ 198:3bde063234aa

fc-simtool plmnsel-write-list command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 07 Mar 2021 02:48:12 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libutil/plmnlist.c	Sun Mar 07 02:48:12 2021 +0000
@@ -0,0 +1,69 @@
+/*
+ * This module implements a function for reading PLMN lists from files.
+ */
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+
+extern FILE *open_script_input_file();
+
+read_plmn_list_from_file(filename, buf, ef_len)
+	char *filename;
+	u_char *buf;
+	unsigned ef_len;
+{
+	FILE *inf;
+	int lineno, rc;
+	char linebuf[1024], *cp, *np;
+	u_char *dp, *endp;
+
+	inf = open_script_input_file(filename);
+	if (!inf) {
+		perror(filename);
+		return(-1);
+	}
+	dp = buf;
+	endp = buf + ef_len;
+	for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) {
+		if (!index(linebuf, '\n')) {
+			fprintf(stderr,
+				"%s line %d: too long or missing newline\n",
+				filename, lineno);
+			fclose(inf);
+			return(-1);
+		}
+		for (cp = linebuf; ; ) {
+			while (isspace(*cp))
+				cp++;
+			if (*cp == '\0' || *cp == '#')
+				break;
+			for (np = cp; *cp && !isspace(*cp); cp++)
+				;
+			if (*cp)
+				*cp++ = '\0';
+			if (dp >= endp) {
+				fprintf(stderr,
+			"%s line %d: number of PLMN codes exceeds EF size\n",
+					filename, lineno);
+				fclose(inf);
+				return(-1);
+			}
+			rc = encode_plmn_3bytes(np, dp);
+			if (rc < 0) {
+				fprintf(stderr, "%s line %d: invalid MCC-MNC\n",
+					filename, lineno);
+				fclose(inf);
+				return(-1);
+			}
+			dp += 3;
+		}
+	}
+	fclose(inf);
+	while (dp < endp)
+		*dp++ = 0xFF;
+	return(0);
+}