aboutsummaryrefslogtreecommitdiffstats
path: root/dvb-t/se-Oxberg
blob: 6a61626adea6684e7e4ebaeb7463b02b0ce32761 (plain)
1
2
3
# Sweden - Oxberg
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 738000000 8MHz 2/3 NONE QAM64 8k 1/8 NONE
#336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include "dllist.h"
#include "misc.h"
#include "fdset.h"

struct fdset fds[1];		/* global fd list */


int fdset_init(struct fdset *fds)
{
    dl_init(fds->list);
    fds->del_count = 0;
    return 0;
}


int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data)
{
    struct fdset_node *fn;

    if (fd < 0)
	return -1;
    if (handler == 0)
	return -1;

    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
	if (fn->fd == fd)
	    return -1;

    if (not(fn = malloc(sizeof(*fn))))
	return -1;
    fn->fd = fd;
    fn->handler = handler;
    fn->data = data;
    dl_insert_last(fds->list, fn->node);
    return 0;
}


int fdset_del_fd(struct fdset *fds, int fd)
{
    struct fdset_node *fn;

    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
	if (fn->fd == fd)
	{
	    dl_remove(fn->node);
	    free(fn);
	    fds->del_count++;
	    return 0;
	}
    return -1;
}


int fdset_select(struct fdset *fds, int timeout)
{
    struct fdset_node *fn;
    fd_set rfds[1];
    struct timeval tv[1], *tvp = 0;
    int max_fd, x, del_count;

    FD_ZERO(rfds);
    max_fd = 0;
    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
    {
	FD_SET(fn->fd, rfds);
	if (fn->fd >= max_fd)
	    max_fd = fn->fd + 1;
    }

    if (timeout >= 0)
    {
	tv->tv_sec = timeout/1000;
	tv->tv_usec = timeout%1000*1000;
	tvp = tv;
    }

    x = select(max_fd, rfds, 0, 0, tvp);
    if (x <= 0)
	return x;

    /* A little bit complicated. A called handler may modify the fdset... */
restart:
    del_count = fds->del_count;
    for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
	if (FD_ISSET(fn->fd, rfds))
	{
	    FD_CLR(fn->fd, rfds);
	    fn->handler(fn->data, fn->fd);
	    if (fds->del_count != del_count)
		goto restart;
	}
    return 1;
}