- pw = getpwuid(uid);
- if (!pw)
- err(1, "getpwuid failed");
- if (strlcpy(myname, pw->pw_name, sizeof(myname)) >= sizeof(myname))
+#ifdef __OpenBSD__
+ rv = getpwuid_r(uid, &mypwstore, mypwbuf, sizeof(mypwbuf), &mypw);
+ if (rv != 0 || mypw == NULL)
+ 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 || mypw == NULL)
+ err(1, "getpwuid_r failed");
+#endif
+ if (strlcpy(myname, mypw->pw_name, sizeof(myname)) >= sizeof(myname))