summaryrefslogtreecommitdiff
path: root/reentr.c
diff options
context:
space:
mode:
Diffstat (limited to 'reentr.c')
-rw-r--r--reentr.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/reentr.c b/reentr.c
index ede96a9d18..10c2d88655 100644
--- a/reentr.c
+++ b/reentr.c
@@ -381,6 +381,16 @@ Perl_reentrant_retry(const char *f, ...)
#endif
if (key == 0) {
+
+#ifdef HAS_GETSPNAM_R
+
+ /* This is a #define as has no corresponding keyword */
+ if (strEQ(f, "getspnam")) {
+ key = KEY_getspnam;
+ }
+
+#endif
+
}
else if (key < 0) {
key = -key;
@@ -510,9 +520,9 @@ Perl_reentrant_retry(const char *f, ...)
# endif
# ifdef USE_PWENT_BUFFER
- case KEY_getpwnam:
- case KEY_getpwuid:
- case KEY_getpwent:
+ case KEY_getpwnam:
+ case KEY_getpwuid:
+ case KEY_getpwent:
{
# ifdef PERL_REENTRANT_MAXSIZE
@@ -551,6 +561,31 @@ Perl_reentrant_retry(const char *f, ...)
break;
# endif
+# ifdef USE_SPENT_BUFFER
+
+ case KEY_getspnam:
+ {
+ char * name;
+
+# ifdef PERL_REENTRANT_MAXSIZE
+ if (PL_reentrant_buffer->_spent_size <=
+ PERL_REENTRANT_MAXSIZE / 2)
+
+# endif
+ RenewDouble(PL_reentrant_buffer->_spent_buffer,
+ &PL_reentrant_buffer->_spent_size, char);
+ switch (key) {
+ case KEY_getspnam:
+ name = va_arg(ap, char *);
+ retptr = getspnam(name); break;
+ default:
+ SETERRNO(ERANGE, LIB_INVARG);
+ break;
+ }
+ }
+ break;
+
+# endif
# ifdef USE_PROTOENT_BUFFER
case KEY_getprotobyname: