- pw = getpwuid(uid);
- if (!pw)
- err(1, "getpwuid failed");
- if (strlcpy(myname, pw->pw_name, sizeof(myname)) >= sizeof(myname))
- errx(1, "pw_name too long");
+#ifdef __OpenBSD__
+ rv = getpwuid_r(uid, &mypwstore, mypwbuf, sizeof(mypwbuf), &mypw);
+ if (rv != 0)
+ err(1, "getpwuid_r failed");
+#else
+ for (size_t sz = 1024; sz <= 16*1024; sz *= 2) {
+ mypwbuf = reallocarray(mypwbuf, sz, sizeof (char));
+ if (mypwbuf == NULL)
+ errx(1, "can't allocate mypwbuf");
+ rv = getpwuid_r(uid, &mypwstore, mypwbuf, sz, &mypw);
+ if (rv != ERANGE)
+ break;
+ }
+ if (rv != 0)
+ err(1, "getpwuid_r failed");
+#endif
+ if (mypw == NULL)
+ errx(1, "no passwd entry for self");