summaryrefslogtreecommitdiff
path: root/emu/port/srv.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /emu/port/srv.c
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'emu/port/srv.c')
-rw-r--r--emu/port/srv.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/emu/port/srv.c b/emu/port/srv.c
new file mode 100644
index 00000000..86a004c8
--- /dev/null
+++ b/emu/port/srv.c
@@ -0,0 +1,153 @@
+#include "dat.h"
+#include "fns.h"
+#include "error.h"
+#include <interp.h>
+#include <isa.h>
+#include "ip.h"
+#include "srv.h"
+#include "srvm.h"
+
+static QLock dbq;
+
+void
+Srv_init(void *fp)
+{
+ USED(fp);
+}
+
+void
+Srv_iph2a(void *fp)
+{
+ Heap *hpt;
+ String *ss;
+ F_Srv_iph2a *f;
+ int i, n, nhost;
+ List **h, *l, *nl;
+ char *hostv[10];
+ void *r;
+
+ f = fp;
+ r = *f->ret;
+ *f->ret = H;
+ destroy(r);
+ release();
+ qlock(&dbq);
+ if(waserror()){
+ qunlock(&dbq);
+ acquire();
+ return;
+ }
+ nhost = so_gethostbyname(string2c(f->host), hostv, nelem(hostv));
+ poperror();
+ qunlock(&dbq);
+ acquire();
+ if(nhost == 0)
+ return;
+
+ l = (List*)H;
+ h = &l;
+ for(i = 0; i < nhost; i++) {
+ n = strlen(hostv[i]);
+ ss = newstring(n);
+ memmove(ss->Sascii, hostv[i], n);
+ free(hostv[i]);
+
+ hpt = nheap(sizeof(List) + IBY2WD);
+ hpt->t = &Tlist;
+ hpt->t->ref++;
+ nl = H2D(List*, hpt);
+ nl->t = &Tptr;
+ Tptr.ref++;
+ nl->tail = (List*)H;
+ *(String**)nl->data = ss;
+
+ *h = nl;
+ h = &nl->tail;
+ }
+ *f->ret = l;
+}
+
+void
+Srv_ipa2h(void *fp)
+{
+ Heap *hpt;
+ String *ss;
+ F_Srv_ipa2h *f;
+ int i, n, naliases;
+ List **h, *l, *nl;
+ char *hostv[10];
+ void *r;
+
+ f = fp;
+ r = *f->ret;
+ *f->ret = H;
+ destroy(r);
+ release();
+ qlock(&dbq);
+ if(waserror()){
+ qunlock(&dbq);
+ acquire();
+ return;
+ }
+ naliases = so_gethostbyaddr(string2c(f->addr), hostv, nelem(hostv));
+ poperror();
+ qunlock(&dbq);
+ acquire();
+ if(naliases == 0)
+ return;
+
+ l = (List*)H;
+ h = &l;
+ for(i = 0; i < naliases; i++) {
+ n = strlen(hostv[i]);
+ ss = newstring(n);
+ memmove(ss->Sascii, hostv[i], n);
+ free(hostv[i]);
+
+ hpt = nheap(sizeof(List) + IBY2WD);
+ hpt->t = &Tlist;
+ hpt->t->ref++;
+ nl = H2D(List*, hpt);
+ nl->t = &Tptr;
+ Tptr.ref++;
+ nl->tail = (List*)H;
+ *(String**)nl->data = ss;
+
+ *h = nl;
+ h = &nl->tail;
+ }
+ *f->ret = l;
+}
+
+void
+Srv_ipn2p(void *fp)
+{
+ int n;
+ char buf[16];
+ F_Srv_ipn2p *f;
+ void *r;
+
+ f = fp;
+ r = *f->ret;
+ *f->ret = H;
+ destroy(r);
+ release();
+ qlock(&dbq);
+ if(waserror()){
+ qunlock(&dbq);
+ acquire();
+ return;
+ }
+ n = so_getservbyname(string2c(f->service), string2c(f->net), buf);
+ poperror();
+ qunlock(&dbq);
+ acquire();
+ if(n >= 0)
+ retstr(buf, f->ret);
+}
+
+void
+srvmodinit(void)
+{
+ builtinmod("$Srv", Srvmodtab, Srvmodlen);
+}