#include #include #include "lx.h" #include "proto.h" #include "internal.h" typedef struct priv_InternAtom PRIV_InternAtom; struct priv_InternAtom { LX_XID *atomp; } ; static void done_InternAtom(LX_CONN *xc, const unsigned char *rep, void *pv) { PRIV_InternAtom *p; LX_XID atom; p = pv; do <"ret"> { if (r_card32(rep+4) != 0) { lx__protoerr(xc,"InternAtom response length wrong (%u, expecting 0)",r_card32(rep+4)); break <"ret">; } if (p->atomp) { atom = r_card32(rep+8); if (atom == 0) atom = LX_ATOM_None; *p->atomp = atom; } } while (0); free(p); } LX_OP *lx_InternAtom(LX_CONN *xc, int only_if_exists, const char *name, int len, LX_XID *atomp) { unsigned char reqhdr[8]; PRIV_InternAtom *p; if (xc->flags & XCF_FAIL) { lx__bad_call(xc,"lx_InternAtom"); return(0); } lx__nochain(xc); if (len == -1) len = strlen(name); if ((len < 0) || (len > 65535)) { lx__bad_call(xc,"lx_InternAtom"); return(0); } p = malloc(sizeof(PRIV_InternAtom)); if (! p) { lx__nomem_fail(xc); return(0); } p->atomp = atomp; reqhdr[0] = XP_REQ_InternAtom; reqhdr[1] = lx__boolean_to_proto(only_if_exists); w_card16(&reqhdr[2],2+((len+3)>>2)); w_card16(&reqhdr[4],len); lx__just_send(xc,&reqhdr[0],8); lx__just_send(xc,name,len); lx__send_padding(xc,len); return(lx__expect_reply(xc,0,0,&done_InternAtom,p)); }