- data.size = key.size;
- key.data = namebuf;
- np = namebuf;
- for (cp = nf; *cp != '\0'; *np++ = *cp++)
- if (*cp == ':' || *cp == '|') {
- *np = '\0';
- key.size = strlen(namebuf) + 1;
- if ((stdb = capdbp->put(capdbp, &key, &data,
- R_NOOVERWRITE)) < 0)
- err(1, "put: %s", strerror(errno));
- if (stdb == 1)
- err(0,
- "ignored duplicate: %s", namebuf);
- np = namebuf;
- continue;
+ /* The rest of the names reference the entire name. */
+ ((char *)(data.data))[0] = SHADOW;
+ memmove(&((u_char *)(data.data))[1], key.data, key.size);
+ data.size = key.size + 1;
+
+ /* Store references for other names. */
+ for (p = t = bp;; ++p) {
+ if (p > t && (*p == ':' || *p == '|')) {
+ key.size = p - t;
+ key.data = t;
+ switch(capdbp->put(capdbp,
+ &key, &data, R_NOOVERWRITE)) {
+ case -1:
+ err(1, "put");
+ /* NOTREACHED */
+ case 1:
+ warnx("ignored duplicate: %.*s",
+ key.size, (char *)key.data);
+ }
+ t = p + 1;