/*=========================================================================*/ SLPMessage SLPMessageRealloc(SLPMessage msg) /* Reallocates memory for a SLP message descriptor */ /* */ /* Returns - A newly allocated SLPMessage pointer of NULL on ENOMEM */ /*=========================================================================*/ { if(msg == 0) { msg = SLPMessageAlloc(); if(msg == 0) { return 0; } } else { SLPMessageFreeInternals(msg); } return msg; }
/*=========================================================================*/ int SLPMessageParseBuffer(SLPBuffer buffer, SLPMessage message) /* Initializes a message descriptor by parsing the specified buffer. */ /* */ /* buffer - (IN) pointer the SLPBuffer to parse */ /* */ /* message - (OUT) set to describe the message from the buffer */ /* */ /* Returns - Zero on success, SLP_ERROR_PARSE_ERROR, or */ /* SLP_ERROR_INTERNAL_ERROR if out of memory. SLPMessage is */ /* invalid return is not successful. */ /* */ /* WARNING - If successful, pointers in the SLPMessage reference memory in*/ /* the parsed SLPBuffer. If SLPBufferFree() is called then the */ /* pointers in SLPMessage will be invalidated. */ /*=========================================================================*/ { int result; /* Get ready to parse */ SLPMessageFreeInternals(message); buffer->curpos = buffer->start; /* parse the header first */ result = ParseHeader(buffer,&(message->header)); if(result == 0) { #if defined(ENABLE_SLPv1) if(message->header.version == 1) return SLPv1MessageParseBuffer(buffer, &(message->header), message); #endif /* switch on the function id to parse the body */ switch(message->header.functionid) { case SLP_FUNCT_SRVRQST: result = ParseSrvRqst(buffer,&(message->body.srvrqst)); break; case SLP_FUNCT_SRVRPLY: result = ParseSrvRply(buffer,&(message->body.srvrply)); break; case SLP_FUNCT_SRVREG: result = ParseSrvReg(buffer,&(message->body.srvreg)); break; case SLP_FUNCT_SRVDEREG: result = ParseSrvDeReg(buffer,&(message->body.srvdereg)); break; case SLP_FUNCT_SRVACK: result = ParseSrvAck(buffer,&(message->body.srvack)); break; case SLP_FUNCT_ATTRRQST: result = ParseAttrRqst(buffer,&(message->body.attrrqst)); break; case SLP_FUNCT_ATTRRPLY: result = ParseAttrRply(buffer,&(message->body.attrrply)); break; case SLP_FUNCT_DAADVERT: result = ParseDAAdvert(buffer,&(message->body.daadvert)); break; case SLP_FUNCT_SRVTYPERQST: result = ParseSrvTypeRqst(buffer,&(message->body.srvtyperqst)); break; case SLP_FUNCT_SRVTYPERPLY: result = ParseSrvTypeRply(buffer,&(message->body.srvtyperply)); break; #if 0 case SLP_FUNCT_SAADVERT: result = ParseSAAdvert(buffer,&(message->body.saadvert)); break; #endif default: result = SLP_ERROR_MESSAGE_NOT_SUPPORTED; } } return result; }
/*=========================================================================*/ int SLPv1MessageParseBuffer(struct sockaddr_in* peerinfo, SLPBuffer buffer, SLPMessage message) /* Initializes a SLPv1 message descriptor by parsing the specified buffer. */ /* */ /* peerinfo - (IN pointer to information about where buffer came from */ /* */ /* buffer - (IN) pointer the SLPBuffer to parse */ /* */ /* message - (OUT) set to describe the message from the buffer */ /* */ /* Returns - Zero on success, SLP_ERROR_PARSE_ERROR, or */ /* SLP_ERROR_INTERNAL_ERROR if out of memory. SLPMessage is */ /* invalid return is not successful. */ /* */ /* WARNING - If successful, pointers in the SLPMessage reference memory in*/ /* the parsed SLPBuffer. If SLPBufferFree() is called then the */ /* pointers in SLPMessage will be invalidated. */ /*=========================================================================*/ { int result; /* Copy in the peer info */ memcpy(&message->peer,peerinfo,sizeof(message->peer)); /* Get ready to parse */ SLPMessageFreeInternals(message); buffer->curpos = buffer->start; /* parse the header first */ result = SLPv1MessageParseHeader(buffer,&(message->header)); if(result == 0) { /* switch on the function id to parse the body */ switch(message->header.functionid) { case SLP_FUNCT_SRVRQST: result = v1ParseSrvRqst(buffer, &(message->header), &(message->body.srvrqst)); break; case SLP_FUNCT_SRVREG: result = v1ParseSrvReg(buffer, &(message->header), &(message->body.srvreg)); break; case SLP_FUNCT_SRVDEREG: result = v1ParseSrvDeReg(buffer, &(message->header), &(message->body.srvdereg)); break; case SLP_FUNCT_ATTRRQST: result = v1ParseAttrRqst(buffer, &(message->header), &(message->body.attrrqst)); break; case SLP_FUNCT_DAADVERT: /* We are a SLPv2 DA, drop advertisements from other v1 DAs (including ourselves). The message will be ignored by SLPDv1ProcessMessage(). */ result = 0; break; case SLP_FUNCT_SRVTYPERQST: result = v1ParseSrvTypeRqst(buffer, &(message->header), &(message->body.srvtyperqst)); break; default: result = SLP_ERROR_MESSAGE_NOT_SUPPORTED; } } return result; }