aboutsummaryrefslogtreecommitdiff
path: root/devel/linuxthreads/files/getnetby_r.c
diff options
context:
space:
mode:
authorJason Evans <jasone@FreeBSD.org>2000-01-04 00:05:24 +0000
committerJason Evans <jasone@FreeBSD.org>2000-01-04 00:05:24 +0000
commit1c274b738e16b74f7f1b1ce7ff1d83375da092e6 (patch)
treef819f4323deed8ddce9b0e2ba26c72ba906adaaf /devel/linuxthreads/files/getnetby_r.c
parentd031962a9f300c622cd2288f3e57635dc6506932 (diff)
Notes
Diffstat (limited to 'devel/linuxthreads/files/getnetby_r.c')
-rw-r--r--devel/linuxthreads/files/getnetby_r.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/devel/linuxthreads/files/getnetby_r.c b/devel/linuxthreads/files/getnetby_r.c
new file mode 100644
index 000000000000..75bc2a8b5476
--- /dev/null
+++ b/devel/linuxthreads/files/getnetby_r.c
@@ -0,0 +1,105 @@
+#include "pthread.h"
+#include <netdb.h>
+#include <string.h>
+
+static pthread_mutex_t getnetby_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static int
+convert (struct netent *ret, struct netent *result,
+ char *buf, int buflen)
+{
+ int len, i;
+
+ if (!buf) return -1;
+
+ *result = *ret;
+ result->n_name = (char *) buf;
+ /* This is the size. */
+ len = strlen (ret->n_name) + 1;
+ if (len > buflen) return -1;
+ buflen -= len;
+ buf += len;
+ strcpy (result->n_name, ret->n_name);
+
+ /* How many aliases and how big the buffer should be? There
+ is always a NULL pointer. */
+ for (len = sizeof (char *), i = 0; ret->n_aliases [i]; i++)
+ {
+ /* It should be size of (char *) and the length of string
+ plus 1. */
+ len += strlen (ret->n_aliases [i]) + 1 + sizeof (char *);
+ }
+ if (len > buflen) return -1;
+
+ /* This is an array of char * for n_aliases. */
+ result->n_aliases = (char **) buf;
+ buf += (i + 1) * sizeof (char *);
+
+ /* We copy the aliases now. */
+ for (i = 0; ret->n_aliases [i]; i++)
+ {
+ result->n_aliases [i] = (char *) buf;
+ strcpy (result->n_aliases [i], ret->n_aliases [i]);
+ buf += strlen (ret->n_aliases [i]) + 1;
+ }
+ /* This is the last one */
+ result->n_aliases [i] = NULL;
+
+ return 0;
+}
+
+struct netent *
+getnetbyaddr_r (long net, int type,
+ struct netent *result, char *buffer, int buflen)
+{
+ struct netent *ret;
+
+ pthread_mutex_lock (&getnetby_mutex);
+
+ ret = getnetbyaddr (net, type);
+ if (!ret ||
+ convert (ret, result, buffer, buflen) != 0)
+ {
+ result = NULL;
+ }
+
+ pthread_mutex_unlock (&getnetby_mutex);
+ return result;
+}
+
+struct netent *
+getnetbyname_r (const char *name,
+ struct netent *result, char *buffer, int buflen)
+{
+ struct netent *ret;
+
+ pthread_mutex_lock (&getnetby_mutex);
+
+ ret = getnetbyname (name);
+ if (!ret ||
+ convert (ret, result, buffer, buflen) != 0)
+ {
+ result = NULL;
+ }
+
+ pthread_mutex_unlock (&getnetby_mutex);
+ return result;
+}
+
+struct netent *
+getnetent_r (struct netent *result, char *buffer, int buflen)
+{
+ struct netent *ret;
+
+ pthread_mutex_lock (&getnetby_mutex);
+
+ ret = getnetent ();
+ if (!ret ||
+ convert (ret, result, buffer, buflen) != 0)
+ {
+ result = NULL;
+ }
+
+ pthread_mutex_unlock (&getnetby_mutex);
+ return result;
+}