On Sun, May 29, 2011 at 04:22:07PM -0300, Friedrich Locke wrote: > Dear list users, > > i am planning on migrating from tradicional unix password files to LDAP. > But i have one question: what about uid definition? Does ldap will > (for instance) auto increment it? > If not, how will ldap manage uid alocation? > > Thanks in advance. >
Hi! You have to manage that for yourself; this might help your tools written in C. And note that in most schemas it's not 'uid', but 'uidNumber'. -- Martin Pelikan unsigned find_lowest_uidnum(LDAP *l, const char *bdn) { static char uidNumber[] = "uidNumber"; static char *attrs[] = { uidNumber, NULL }; int error, cur, i; u_int8_t used[UIDNUMBER_MAX - UIDNUMBER_MIN]; LDAPMessage *e; LDAPMessage *res; struct berval **vals; if ((error = ldap_search_ext_s(l, bdn, LDAP_SCOPE_ONELEVEL, NULL, attrs, 0, NULL, NULL, NULL, 0, &res)) != LDAP_SUCCESS) errx(1, "find_lowest_uidnum: synchronous search: %s", ldap_err2string(error)); memset(used, 0, sizeof used); for (e = ldap_first_entry(l, res); e; e = ldap_next_entry(l, e)) { vals = ldap_get_values_len(l, e, uidNumber); if (ldap_count_values_len(vals) != 1) { warnx("Weird amount of UID numbers!"); ldap_value_free_len(vals); continue; } cur = atoi(vals[0]->bv_val) - UIDNUMBER_MIN; if (cur >= 0 && cur < (UIDNUMBER_MAX - UIDNUMBER_MIN)) { used[cur]++; } ldap_value_free_len(vals); } ldap_msgfree(res); for (i = 0; i < (UIDNUMBER_MAX - UIDNUMBER_MIN); ++i) { if (used[i] == 0) { return (i + UIDNUMBER_MIN); } } return (-1); }