static void account_au_fn(const char *token, char *value, void *setting, FILE *f) {
	struct s_auth *account = setting;
	if (value) {
		// set default values for usage during runtime from Webif
		account->autoau = 0;
		if (!account->aureader_list)
			account->aureader_list = ll_create("aureader_list");
		if (streq(value, "1"))
			account->autoau = 1;
		strtolower(value);
		ll_clear(account->aureader_list);
		LL_ITER itr = ll_iter_create(configured_readers);
		struct s_reader *rdr;
		char *pch, *saveptr1 = NULL;
		for (pch = strtok_r(value, ",", &saveptr1); pch != NULL; pch = strtok_r(NULL, ",", &saveptr1)) {
			ll_iter_reset(&itr);
			while ((rdr = ll_iter_next(&itr))) {
				if (streq(rdr->label, pch) || account->autoau) {
					ll_append(account->aureader_list, rdr);
				}
			}
		}
		return;
	}
	if (account->autoau == 1) {
		fprintf_conf(f, token, "%d\n", account->autoau);
	} else if (account->aureader_list) {
		value = mk_t_aureader(account);
		if (strlen(value) > 0)
			fprintf_conf(f, token, "%s\n", value);
		free_mk_t(value);
	} else if (cfg.http_full_cfg) {
		fprintf_conf(f, token, "%s\n", "");
	}
}
Beispiel #2
0
/*
 * returns string of comma separated values
 */
char *mk_t_emmbylen(struct s_reader *rdr)
{
    char *value, *pos, *dot = "";
    int32_t num, needed = 0;
    struct s_emmlen_range *blocklen;

    if(!rdr->blockemmbylen)
    {
        return "";
    }

    LL_ITER it = ll_iter_create(rdr->blockemmbylen);
    while((blocklen = ll_iter_next(&it)))
    {
        needed += 5 + 1; // max digits of int16 + ","
        if(blocklen->max == 0)
        {
            needed += 1 + 1;    // "-" + ","
        }
        else if(blocklen->min != blocklen->max)
        {
            needed += 1 + 5 + 1;    // "-" + max digits of int16 + ","
        }
    }
    // the trailing zero is already included: it's the first ","
    if(!cs_malloc(&value, needed))
    {
        return "";
    }

    pos = value;
    ll_iter_reset(&it);
    while((blocklen = ll_iter_next(&it)))
    {
        if(blocklen->min == blocklen->max)
        {
            num = snprintf(pos, needed, "%s%d", dot, blocklen->min);
        }
        else if(blocklen->max == 0)
        {
            num = snprintf(pos, needed, "%s%d-", dot, blocklen->min);
        }
        else
        {
            num = snprintf(pos, needed, "%s%d-%d", dot, blocklen->min, blocklen->max);
        }
        pos += num;
        needed -= num;
        dot = ",";
    }
    return value;
}
Beispiel #3
0
void log_list_thread(void)
{
	char buf[LOG_BUF_SIZE];
	int last_count=ll_count(log_list), count, grow_count=0, write_count;
	do {
		LL_ITER it = ll_iter_create(log_list);
		struct s_log *log;
		write_count = 0;
		while ((log=ll_iter_next_remove(&it))) {
			int8_t do_flush = ll_count(log_list) == 0; //flush on writing last element

			cs_strncpy(buf, log->txt, LOG_BUF_SIZE);
			if (log->direct_log)
				cs_write_log(buf, do_flush);
			else
				write_to_log(buf, log, do_flush);
			free(log->txt);
			free(log);

			//If list is faster growing than we could write to file, drop list:
			write_count++;
			if (write_count%10000 == 0) { //check every 10000 writes:
				count = ll_count(log_list);
				if (count > last_count) {
					grow_count++;
					if (grow_count > 5) { //5 times still growing
						cs_write_log("------------->logging temporary disabled (30s) - too much data!\n", 1);
						cfg.disablelog = 1;
						ll_iter_reset(&it);
						while ((log=ll_iter_next_remove(&it))) { //clear log
							free(log->txt);
							free(log);
						}
						cs_sleepms(30*1000);
						cfg.disablelog = 0;

						grow_count = 0;
						last_count = 0;
						break;
					}
				}
				else
					grow_count = 0;
				last_count = count;
			}
		}
		cs_sleepms(250);
	} while(1);
}