/*=========================================================================*/ int KnownDABadDA(struct sockaddr_in* peeraddr) /* Mark a KnownDA as a Bad DA. */ /* */ /* peeraddr (IN) address of the bad DA */ /* */ /* Returns: zero on success. */ /*=========================================================================*/ { SLPDAEntry* entry; entry = (SLPDAEntry*)G_KnownDACache.head; while(entry) { if(memcmp(&(peeraddr->sin_addr), &(entry->daaddr), sizeof(struct in_addr)) == 0) { /* Remove entry from list and free it */ SLPDAEntryFree( (SLPDAEntry*)SLPListUnlink(&G_KnownDACache, (SLPListItem*)entry) ); break; } entry = (SLPDAEntry*) entry->listitem.next; } return 0; }
/*=========================================================================*/ int KnownDAConnect(const char* scopelist, int scopelistlen, struct sockaddr_in* peeraddr, struct timeval* timeout) /*=========================================================================*/ { int sock; SLPDAEntry* entry; SLPDAEntry* del = 0; /* TODO THIS FUNCTION MUST BE SYNCRONIZED !! */ memset(peeraddr,0,sizeof(struct sockaddr_in)); peeraddr->sin_family = AF_INET; peeraddr->sin_port = htons(SLP_RESERVED_PORT); entry = (SLPDAEntry*)G_KnownDAList.head; while(entry) { if(SLPIntersectStringList(entry->scopelistlen, entry->scopelist, scopelistlen, scopelist)) { peeraddr->sin_addr = entry->daaddr; sock = SLPNetworkConnectStream(peeraddr,timeout); if(sock >= 0) { return sock; } del = entry; } entry = (SLPDAEntry*) entry->listitem.next; if (del) { SLPDAEntryFree((SLPDAEntry*)SLPListUnlink(&G_KnownDAList,(SLPListItem*)del)); KnownDASaveHints(); } } return -1; }
/*=========================================================================*/ SLPDAEntry* SLPDKnownDARemove(SLPDAEntry* entry) /* */ /* entry- (IN) pointer to entry to remove */ /* */ /* Returns: The previous SLPDAEntry (may be null). */ /*=========================================================================*/ { SLPDAEntry* del = entry; entry = (SLPDAEntry*)entry->listitem.next; ListUnlink((PListItem*)&G_KnownDAListHead,(PListItem)del); if(entry == 0) { entry = G_KnownDAListHead; } SLPDAEntryFree(del); return entry; }
/*-------------------------------------------------------------------------*/ int KnownDAListRemove(SLPList* dalist, SLPDAEntry* remove) /* Remove an entry to the KnownDA cach */ /*-------------------------------------------------------------------------*/ { SLPDAEntry* entry; entry = (SLPDAEntry*)dalist->head; while(entry) { if(SLPCompareString(remove->urllen, remove->url, entry->urllen, entry->url) == 0) { /* Remove entry from list and free it */ SLPDAEntryFree( (SLPDAEntry*)SLPListUnlink(dalist, (SLPListItem*)entry) ); break; } entry = (SLPDAEntry*) entry->listitem.next; } return 0; }