static int ParseLine(char *buffer, struct rx_identity *user) { char *ptr; char *ename; char *displayName; char *decodedName; char name[64+1]; int len; int kind; int code; if (buffer[0] == ' ') { /* extended names have leading space */ ptr = buffer + 1; code = sscanf(ptr, "%i", &kind); if (code != 1) return EINVAL; strsep(&ptr, " "); /* skip the bit we just read with scanf */ ename = strsep(&ptr, " "); /* Pull out the ename */ displayName = strsep(&ptr, " "); /* Display name runs to the end */ if (ename == NULL || displayName == NULL) return EINVAL; decodedName = malloc(strlen(ename)); if (decodedName == NULL) return ENOMEM; len = base64_decode(ename, decodedName); if (len<0) { free(decodedName); return EINVAL; } rx_identity_populate(user, kind, displayName, decodedName, len); free(decodedName); return 0; /* Success ! */ } /* No extended name, try for a legacy name */ code = sscanf(buffer, "%64s", name); if (code != 1) return EINVAL; rx_identity_populate(user, RX_ID_KRB4, name, name, strlen(name)); return 0; }
void rx_identity_copyContents(struct rx_identity *to, struct rx_identity *from) { rx_identity_populate(to, from->kind, from->displayName, from->exportedName.val, from->exportedName.len); return; }
struct rx_identity * rx_identity_new(rx_identity_kind kind, char *displayName, void *enameData, size_t enameLength) { struct rx_identity *identity; identity = rxi_Alloc(sizeof(struct rx_identity)); rx_identity_populate(identity, kind, displayName, enameData, enameLength); return identity; }