- sprintf( buf, "%s@%s", pw->pw_name, be->be_suffix[0] );
- e->e_dn = strdup( buf );
-
- val.bv_val = pw->pw_name;
- val.bv_len = strlen( pw->pw_name );
- attr_merge( e, "cn", vals );
- attr_merge( e, "sn", vals );
- attr_merge( e, "uid", vals );
- val.bv_val = pw->pw_gecos;
- val.bv_len = strlen( pw->pw_gecos );
- attr_merge( e, "cn", vals );
- val.bv_val = "person";
- val.bv_len = strlen( val.bv_val );
- attr_merge( e, "objectclass", vals );
+ vals[1].bv_val = NULL;
+
+ /* objectclasses should be configurable items */
+ vals[0].bv_val = "top";
+ vals[0].bv_len = sizeof("top")-1;
+ attr_mergeit( e, ad_objectClass, vals );
+
+ vals[0].bv_val = "person";
+ vals[0].bv_len = sizeof("person")-1;
+ attr_mergeit( e, ad_objectClass, vals );
+
+ vals[0].bv_val = "uidObject";
+ vals[0].bv_len = sizeof("uidObject")-1;
+ attr_mergeit( e, ad_objectClass, vals );
+
+ vals[0].bv_val = pw->pw_name;
+ vals[0].bv_len = pwlen;
+ attr_mergeit( e, ad_uid, vals ); /* required by uidObject */
+ attr_mergeit( e, ad_cn, vals ); /* required by person */
+ attr_mergeit( e, ad_sn, vals ); /* required by person */
+
+#ifdef HAVE_PW_GECOS
+ /*
+ * if gecos is present, add it as a cn. first process it
+ * according to standard BSD usage. If the processed cn has
+ * a space, use the tail as the surname.
+ */
+ if (pw->pw_gecos[0]) {
+ char *s;
+
+ vals[0].bv_val = pw->pw_gecos;
+ vals[0].bv_len = strlen(vals[0].bv_val);
+ attr_mergeit(e, ad_description, vals);
+
+ s = strchr(vals[0].bv_val, ',');
+ if (s) *s = '\0';
+
+ s = strchr(vals[0].bv_val, '&');
+ if (s) {
+ char buf[1024];
+
+ if( vals[0].bv_len + pwlen < sizeof(buf) ) {
+ int i = s - vals[0].bv_val;
+ strncpy(buf, vals[0].bv_val, i);
+ s = buf+i;
+ strcpy(s, pw->pw_name);
+ *s = TOUPPER((unsigned char)*s);
+ strcat(s, vals[0].bv_val+i+1);
+ vals[0].bv_val = buf;
+ }
+ }
+ vals[0].bv_len = strlen(vals[0].bv_val);
+
+ if ( vals[0].bv_len && strcasecmp( vals[0].bv_val, pw->pw_name )) {
+ attr_mergeit( e, ad_cn, vals );
+ }
+
+ if ( (s=strrchr(vals[0].bv_val, ' '))) {
+ vals[0].bv_val = s + 1;
+ vals[0].bv_len = strlen(vals[0].bv_val);
+ attr_mergeit(e, ad_sn, vals);
+ }
+ }
+#endif