view simtool/pbupd_immhex.c @ 184:8d073ff62c48

fc-simtool: imsi command does higher-level parsing, the old version is now imsi-raw
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 06 Mar 2021 05:44:17 +0000
parents 52ec2d3eb851
children
line wrap: on
line source

/*
 * This module implements the pb-update-imm-hex command.
 */

#include <sys/types.h>
#include <ctype.h>
#include <string.h>
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
#include "curfile.h"

static
decode_alphatag_arg_hex(arg, record, maxlen)
	char *arg;
	u_char *record;
	unsigned maxlen;
{
	unsigned acclen;

	for (acclen = 0; ; acclen++) {
		while (isspace(*arg))
			arg++;
		if (!*arg)
			break;
		if (!isxdigit(arg[0]) || !isxdigit(arg[1])) {
			fprintf(stderr, "error: invalid hex string input\n");
			return(-1);
		}
		if (acclen >= maxlen) {
			fprintf(stderr,
			"error: alpha tag string is longer than SIM limit\n");
			return(-1);
		}
		record[acclen] = (decode_hex_digit(arg[0]) << 4) |
				 decode_hex_digit(arg[1]);
		arg += 2;
	}
	return(0);
}

cmd_pb_update_imm_hex(argc, argv)
	char **argv;
{
	int rc;
	unsigned recno;
	u_char record[255], *fixp;

	rc = phonebook_op_common(argv[1]);
	if (rc < 0)
		return(rc);
	recno = strtoul(argv[2], 0, 0);
	if (recno < 1 || recno > curfile_record_count) {
		fprintf(stderr, "error: specified record number is invalid\n");
		return(-1);
	}
	memset(record, 0xFF, curfile_record_len);
	fixp = record + curfile_record_len - 14;
	rc = encode_phone_number_arg(argv[3], fixp, 0);
	if (rc < 0)
		return(rc);
	rc = decode_alphatag_arg_hex(argv[4], record, curfile_record_len - 14);
	if (rc < 0)
		return(rc);
	return update_rec_op(recno, 0x04, record, curfile_record_len);
}