void removeTagItemString(int type, char * string) { ListNode * node; int pos; assert(string); assert(tagLists[type]); if(tagLists[type] == NULL) return; /*if(!node) { free(string); return; }*/ if(findNodeInList(tagLists[type], string, &node, &pos)) { TagTrackerItem * item = node->data; item->count--; if(item->count <= 0) deleteNodeFromList(tagLists[type], node); } if(tagLists[type]->numberOfNodes == 0) { freeList(tagLists[type]); tagLists[type] = NULL; } }
int deleteFromList(List * list,char * key) { ListNode * tmpNode; assert(list!=NULL); tmpNode = list->firstNode; while(tmpNode!=NULL && strcmp(tmpNode->key,key)!=0) { tmpNode = tmpNode->nextNode; } if(tmpNode!=NULL) deleteNodeFromList(list,tmpNode); else return 0; return 1; }
void flushInterfaceBuffer(Interface * interface) { ListNode * node = NULL; char * str; int ret = 0; while((node = interface->bufferList->firstNode)) { str = (char *)node->data; if((ret = write(interface->fd,str,strlen(str)))<0) break; else if(ret<strlen(str)) { interface->outputBufferSize-=ret; str = strdup(&str[ret]); free(node->data); node->data = str; } else { interface->outputBufferSize-= strlen(str)+1; interface->outputBufferSize-= sizeof(ListNode); deleteNodeFromList(interface->bufferList,node); } interface->lastTime = time(NULL); } if(!interface->bufferList->firstNode) { DEBUG("interface %i: buffer empty\n",interface->num); freeList(interface->bufferList); interface->bufferList = NULL; } else if(ret<0 && errno!=EAGAIN && errno!=EINTR) { /* cause interface to close */ DEBUG("interface %i: problems flushing buffer\n", interface->num); freeList(interface->bufferList); interface->bufferList = NULL; interface->expired = 1; } }