*
* Purpose : Functions related to client-specific tags.
*
- * Copyright : Copyright (C) 2016 Fabian Keil <fk@fabiankeil.de>
+ * Copyright : Copyright (C) 2016-2017 Fabian Keil <fk@fabiankeil.de>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
}
+
+/*********************************************************************
+ *
+ * Function : create_client_specific_tag
+ *
+ * Description : Allocates memory for a client specific tag
+ * and populates it.
+ *
+ * Parameters :
+ * 1 : name = The name of the tag to create.
+ * 2 : time_to_live = 0, or the number of seconds
+ * the tag remains activated.
+ *
+ * Returns : Pointer to populated tag
+ *
+ *********************************************************************/
+static struct client_specific_tag *create_client_specific_tag(const char *name,
+ const time_t time_to_live)
+{
+ struct client_specific_tag *tag;
+
+ tag = zalloc_or_die(sizeof(struct client_specific_tag));
+ tag->name = strdup_or_die(name);
+ tag->end_of_life = time_to_live ? (time(NULL) + time_to_live) : 0;
+
+ return tag;
+
+}
+
/*********************************************************************
*
* Function : add_tag_for_client
/* XXX: Code duplication. */
requested_tags = zalloc_or_die(sizeof(struct requested_tags));
requested_tags->client = strdup_or_die(client_address);
- requested_tags->tags = zalloc_or_die(sizeof(struct client_specific_tag));
- requested_tags->tags->name = strdup_or_die(tag);
- requested_tags->tags->end_of_life = time_to_live ?
- (time(NULL) + time_to_live) : 0;
+ requested_tags->tags = create_client_specific_tag(tag, time_to_live);
validate_requested_tags();
return;
clients_with_tags->next->prev = clients_with_tags;
clients_with_tags = clients_with_tags->next;
clients_with_tags->client = strdup_or_die(client_address);
- clients_with_tags->tags = zalloc_or_die(sizeof(struct client_specific_tag));
- clients_with_tags->tags->name = strdup_or_die(tag);
- clients_with_tags->tags->end_of_life = time_to_live ?
- (time(NULL) + time_to_live) : 0;
+ clients_with_tags->tags = create_client_specific_tag(tag, time_to_live);
validate_requested_tags();
{
if (enabled_tags->next == NULL)
{
- enabled_tags->next = zalloc_or_die(sizeof(struct client_specific_tag));
- enabled_tags->next->name = strdup_or_die(tag);
- enabled_tags->next->end_of_life = time_to_live ?
- (time(NULL) + time_to_live) : 0;
+ enabled_tags->next = create_client_specific_tag(tag, time_to_live);
enabled_tags->next->prev = enabled_tags;
break;
}
/* Client has preceding client */
clients_with_tags->prev->next = clients_with_tags->next;
}
- freez(clients_with_tags->client);
if (clients_with_tags == requested_tags)
{
- /* Removing last tag */
- freez(requested_tags);
- clients_with_tags = requested_tags;
- }
- else
- {
- freez(clients_with_tags);
+ /*
+ * We're in the process of removing the last tag,
+ * mark the global list as empty.
+ */
+ requested_tags = NULL;
}
+ freez(clients_with_tags->client);
+ freez(clients_with_tags);
}
freez(enabled_tags->name);
freez(enabled_tags);