X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=comstack%2Fxmosi.c;h=b6de3a76b0abacd77820443c2656ca8880a55f62;hp=9e15a289377002eabe6a139eb0d7d923b5f21b98;hb=ab9f5c94f9c68c2cd137d5c27c068200606e18c8;hpb=8a425ff5328260fff0dcc28f08b5bdf6bfac84ab diff --git a/comstack/xmosi.c b/comstack/xmosi.c index 9e15a28..b6de3a7 100644 --- a/comstack/xmosi.c +++ b/comstack/xmosi.c @@ -4,7 +4,40 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: xmosi.c,v $ - * Revision 1.1 1995-06-14 09:58:20 quinn + * Revision 1.12 1996-05-22 08:34:44 adam + * Added ifdef USE_XTIMOSI; so that 'make depend' works. + * + * Revision 1.11 1996/02/23 10:00:41 quinn + * WAIS Work + * + * Revision 1.10 1996/02/10 12:23:13 quinn + * Enablie inetd operations fro TCP/IP stack + * + * Revision 1.9 1996/01/02 08:57:28 quinn + * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass + * + * Revision 1.8 1995/11/01 13:54:29 quinn + * Minor adjustments + * + * Revision 1.7 1995/10/30 12:41:17 quinn + * Added hostname lookup for server. + * + * Revision 1.6 1995/09/29 17:12:00 quinn + * Smallish + * + * Revision 1.5 1995/09/28 10:24:32 quinn + * Windows changes + * + * Revision 1.4 1995/09/27 15:02:45 quinn + * Modified function heads & prototypes. + * + * Revision 1.3 1995/06/16 10:30:38 quinn + * Added REUSEADDR. + * + * Revision 1.2 1995/06/15 12:30:07 quinn + * Added @ as hostname alias for INADDR ANY. + * + * Revision 1.1 1995/06/14 09:58:20 quinn * Renamed yazlib to comstack. * * Revision 1.15 1995/05/29 08:12:33 quinn @@ -59,6 +92,7 @@ * */ +#ifdef USE_XTIMOSI /* * Glue layer for Peter Furniss' xtimosi package. */ @@ -88,6 +122,7 @@ int mosi_rcvconnect(COMSTACK h); int mosi_bind(COMSTACK h, void *address, int mode); int mosi_listen(COMSTACK h, char *addrp, int *addrlen); COMSTACK mosi_accept(COMSTACK h); +char *mosi_addrstr(COMSTACK h); typedef struct mosi_state { @@ -119,7 +154,7 @@ static int addopt(struct netbuf *optbuf, unsigned long level, unsigned long char *str; ent.proto = proto; - ent.class = class; + ent.oclass = class; ent.value = value; if (!(oid = oid_getoidbyent(&ent))) return -1; @@ -129,15 +164,18 @@ static int addopt(struct netbuf *optbuf, unsigned long level, unsigned long return 0; } -COMSTACK mosi_type(int blocking, int protocol) +COMSTACK mosi_type(int s, int blocking, int protocol) { COMSTACK r; mosi_state *state; int flags = O_RDWR; - if (!(r = malloc(sizeof(*r)))) + if (s >= 0) + return 0; + + if (!(r = xmalloc(sizeof(*r)))) return 0; - if (!(state = r->private = malloc(sizeof(*state)))) + if (!(state = r->private = xmalloc(sizeof(*state)))) return 0; state->call = 0; @@ -156,6 +194,7 @@ COMSTACK mosi_type(int blocking, int protocol) r->f_bind = mosi_bind; r->f_listen = mosi_listen; r->f_accept = mosi_accept; + r->f_addrstr = mosi_addrstr; if (!blocking) flags |= O_NONBLOCK; @@ -187,11 +226,11 @@ int hex2oct(char *hex, char *oct) * addressing specific to our hack of OSI transport. A sockaddr_in wrapped * up in a t_mosiaddr in a netbuf (on a stick). */ -struct netbuf *mosi_strtoaddr(const char *str) +struct netbuf MDF *mosi_strtoaddr(const char *str) { - struct netbuf *ret = malloc(sizeof(struct netbuf)); - struct sockaddr_in *add = malloc(sizeof(struct sockaddr_in)); - struct t_mosiaddr *mosiaddr = malloc(sizeof(struct t_mosiaddr)); + struct netbuf *ret = xmalloc(sizeof(struct netbuf)); + struct sockaddr_in *add = xmalloc(sizeof(struct sockaddr_in)); + struct t_mosiaddr *mosiaddr = xmalloc(sizeof(struct t_mosiaddr)); struct hostent *hp; char *p, *b, buf[512], *nsap; short int port = 102; @@ -236,7 +275,9 @@ struct netbuf *mosi_strtoaddr(const char *str) port = atoi(b + 1); } add->sin_port = htons(port); - if ((hp = gethostbyname(buf))) + if (!strcmp("@", buf)) + add->sin_addr.s_addr = INADDR_ANY; + else if ((hp = gethostbyname(buf))) memcpy(&add->sin_addr.s_addr, *hp->h_addr_list, sizeof(struct in_addr)); else if ((tmpadd = inet_addr(buf)) != 0) memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr)); @@ -318,7 +359,13 @@ int mosi_bind(COMSTACK h, void *address, int mode) { int res; struct t_bind bnd; + int one = 1; + if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) + { + h->cerrno = CSYSERR; + return -1; + } if (mode == CS_SERVER) bnd.qlen = 3; else @@ -357,13 +404,13 @@ COMSTACK mosi_accept(COMSTACK h) if (h->state != CS_INCON) { - h->errno = CSOUTSTATE; + h->cerrno = CSOUTSTATE; return 0; } - if (!(new = malloc(sizeof(*new)))) + if (!(new = xmalloc(sizeof(*new)))) return 0; *new = *h; - if (!(new->private = ns = malloc(sizeof(*ns)))) + if (!(new->private = ns = xmalloc(sizeof(*ns)))) return 0; *ns = *st; if (!h->blocking) @@ -395,11 +442,11 @@ int mosi_get(COMSTACK h, char **buf, int *bufsize) { if (!*bufsize) { - if (!(*buf = malloc(*bufsize = CS_MOSI_BUFCHUNK))) + if (!(*buf = xmalloc(*bufsize = CS_MOSI_BUFCHUNK))) return -1; } else if (*bufsize - ct->hasread < CS_MOSI_BUFCHUNK) - if (!(*buf = realloc(*buf, *bufsize *= 2))) + if (!(*buf =xrealloc(*buf, *bufsize *= 2))) return -1; if ((res = u_rcv(h->iofile, *buf + ct->hasread, CS_MOSI_BUFCHUNK, @@ -441,9 +488,16 @@ int mosi_put(COMSTACK h, char *buf, int size) int mosi_close(COMSTACK h) { - free(h->private); + xfree(h->private); if (h->iofile >= 0) u_close(h->iofile); - free(h); + xfree(h); return 0; } + +char *mosi_addrstr(COMSTACK h) +{ + return "osi:[UNIMPLEMENTED]"; +} + +#endif