diff options
| author | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-03-10 02:22:04 +0000 | 
|---|---|---|
| committer | laforge <laforge@99fdad57-331a-0410-800a-d7fa5415bdb3> | 2007-03-10 02:22:04 +0000 | 
| commit | 2797211645d452446cb7b329ee9d3d3a923f8520 (patch) | |
| tree | 5f8dc89cc720f7ea3ce0d6c2b31489addb37c3b8 /src/libgsmd/libgsmd_pin.c | |
| parent | a831d70619f614254692b75c1aca39f21c15fb55 (diff) | |
* properly implement PIN/PUK handling throughout gsmd/libgsmd/util
git-svn-id: http://svn.openmoko.org/trunk/src/target/gsm@1314 99fdad57-331a-0410-800a-d7fa5415bdb3
Diffstat (limited to 'src/libgsmd/libgsmd_pin.c')
| -rw-r--r-- | src/libgsmd/libgsmd_pin.c | 78 | 
1 files changed, 78 insertions, 0 deletions
diff --git a/src/libgsmd/libgsmd_pin.c b/src/libgsmd/libgsmd_pin.c new file mode 100644 index 0000000..e645dd5 --- /dev/null +++ b/src/libgsmd/libgsmd_pin.c @@ -0,0 +1,78 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +#include <sys/types.h> +#include <gsmd/event.h> +#include <libgsmd/libgsmd.h> + +static const char *pin_type_names[__NUM_GSMD_PIN] = { +	[GSMD_PIN_NONE]		= "NONE", +	[GSMD_PIN_SIM_PIN]	= "SIM PIN", +	[GSMD_PIN_SIM_PUK]	= "SIM PUK", +	[GSMD_PIN_PH_SIM_PIN]	= "Phone-to-SIM PIN", +	[GSMD_PIN_PH_FSIM_PIN]	= "Phone-to-very-first SIM PIN", +	[GSMD_PIN_PH_FSIM_PUK]	= "Phone-to-very-first SIM PUK", +	[GSMD_PIN_SIM_PIN2]	= "SIM PIN2", +	[GSMD_PIN_SIM_PUK2]	= "SIM PUK2", +	[GSMD_PIN_PH_NET_PIN]	= "Network personalization PIN", +	[GSMD_PIN_PH_NET_PUK]	= "Network personalizaiton PUK", +	[GSMD_PIN_PH_NETSUB_PIN]= "Network subset personalisation PIN", +	[GSMD_PIN_PH_NETSUB_PUK]= "Network subset personalisation PUK", +	[GSMD_PIN_PH_SP_PIN]	= "Service provider personalisation PIN", +	[GSMD_PIN_PH_SP_PUK]	= "Service provider personalisation PUK", +	[GSMD_PIN_PH_CORP_PIN]	= "Corporate personalisation PIN", +	[GSMD_PIN_PH_CORP_PUK]	= "Corporate personalisation PUK", +}; + +const char *lgsm_pin_name(enum gsmd_pin_type ptype) +{ +	if (ptype >= __NUM_GSMD_PIN) +		return "unknown"; + +	return pin_type_names[ptype]; +} + +int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char *newpin) +{ +	int rc; +	struct { +		struct gsmd_msg_hdr gmh; +		struct gsmd_pin gp; +	} __attribute__ ((packed)) *gm; + +	if (strlen(pin) > GSMD_PIN_MAXLEN ||  +	    (newpin && strlen(newpin) > GSMD_PIN_MAXLEN) || +	    type >= __NUM_GSMD_PIN) +		return -EINVAL; + +	gm = (void *) lgsm_gmh_fill(GSMD_MSG_PIN, GSMD_PIN_INPUT, +				    sizeof(struct gsmd_pin)); +	if (!gm) +		return -ENOMEM; + +	gm->gp.type = type; + +	gm->gp.pin[0] = '\0'; +	strcat(gm->gp.pin, pin); + +	switch (type) { +	case GSMD_PIN_SIM_PUK: +	case GSMD_PIN_SIM_PUK2: +		/* GSM 07.07 explicitly states that only those two PUK types +		 * require a new pin to be specified! Don't know if this is a +		 * bug or a feature. */ +		if (!newpin) +			return -EINVAL; +		gm->gp.newpin[0] = '\0'; +		strcat(gm->gp.newpin, newpin); +		break; +	default: +		break; +	} +	printf("sending pin='%s', newpin='%s'\n", gm->gp.pin, gm->gp.newpin); +	rc = lgsm_send(lh, &gm->gmh); +	free(gm); + +	return rc; +}  | 
