⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.c

📁 linux下的pppoe拨号程序源代码; 不错的开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (t.tv_usec >= 1000000) {	t.tv_usec -= 1000000;	t.tv_sec++;    }    eh->fd = fd;    eh->flags = flags;    eh->tmout = t;    eh->fn = fn;    eh->data = data;    /* Add immediately.  This is safe even if we are in a handler. */    eh->next = es->handlers;    es->handlers = eh;    EVENT_DEBUG(("Event_AddHandlerWithTimeout(es=%p, fd=%d, flags=%u, t=%d/%d) -> %p\n", es, fd, flags, t.tv_sec, t.tv_usec, eh));    return eh;}/*********************************************************************** %FUNCTION: Event_AddTimerHandler* %ARGUMENTS:*  es -- event selector*  t -- time interval after which to trigger event*  fn -- callback function to call when event is triggered*  data -- extra data to pass to callback function* %RETURNS:*  A newly-allocated EventHandler, or NULL.***********************************************************************/EventHandler *Event_AddTimerHandler(EventSelector *es,		      struct timeval t,		      EventCallbackFunc fn,		      void *data){    EventHandler *eh;    struct timeval now;    /* Check time interval for validity */    if (t.tv_sec < 0 || t.tv_usec < 0 || t.tv_usec >= 1000000) {	errno = EINVAL;	return NULL;    }    eh = malloc(sizeof(EventHandler));    if (!eh) return NULL;    /* Convert time interval to absolute time */    gettimeofday(&now, NULL);    t.tv_sec += now.tv_sec;    t.tv_usec += now.tv_usec;    if (t.tv_usec >= 1000000) {	t.tv_usec -= 1000000;	t.tv_sec++;    }    eh->fd = -1;    eh->flags = EVENT_FLAG_TIMER;    eh->tmout = t;    eh->fn = fn;    eh->data = data;    /* Add immediately.  This is safe even if we are in a handler. */    eh->next = es->handlers;    es->handlers = eh;    EVENT_DEBUG(("Event_AddTimerHandler(es=%p, t=%d/%d) -> %p\n", es, t.tv_sec,t.tv_usec, eh));    return eh;}/*********************************************************************** %FUNCTION: Event_DelHandler* %ARGUMENTS:*  es -- event selector*  eh -- event handler* %RETURNS:*  0 if OK, non-zero if there is an error* %DESCRIPTION:*  Deletes the event handler eh***********************************************************************/intEvent_DelHandler(EventSelector *es,		 EventHandler *eh){    /* Scan the handlers list */    EventHandler *cur, *prev;    EVENT_DEBUG(("Event_DelHandler(es=%p, eh=%p)\n", es, eh));    for (cur=es->handlers, prev=NULL; cur; prev=cur, cur=cur->next) {	if (cur == eh) {	    if (es->nestLevel) {		eh->flags |= EVENT_FLAG_DELETED;		es->opsPending = 1;		return 0;	    } else {		if (prev) prev->next = cur->next;		else      es->handlers = cur->next;		DestroyHandler(cur);		return 0;	    }	}    }    /* Handler not found */    return 1;}/*********************************************************************** %FUNCTION: DestroySelector* %ARGUMENTS:*  es -- an event selector* %RETURNS:*  Nothing* %DESCRIPTION:*  Destroys selector and all associated handles.***********************************************************************/voidDestroySelector(EventSelector *es){    EventHandler *cur, *next;    for (cur=es->handlers; cur; cur=next) {	next = cur->next;	DestroyHandler(cur);    }    free(es);}/*********************************************************************** %FUNCTION: DestroyHandler* %ARGUMENTS:*  eh -- an event handler* %RETURNS:*  Nothing* %DESCRIPTION:*  Destroys handler***********************************************************************/voidDestroyHandler(EventHandler *eh){    EVENT_DEBUG(("DestroyHandler(eh=%p)\n", eh));    free(eh);}/*********************************************************************** %FUNCTION: DoPendingChanges* %ARGUMENTS:*  es -- an event selector* %RETURNS:*  Nothing* %DESCRIPTION:*  Makes all pending insertions and deletions happen.***********************************************************************/voidDoPendingChanges(EventSelector *es){    EventHandler *cur, *prev, *next;    es->opsPending = 0;    /* If selector is to be deleted, do it and skip everything else */    if (es->destroyPending) {	DestroySelector(es);	return;    }    /* Do deletions */    cur = es->handlers;    prev = NULL;    while(cur) {	if (!(cur->flags & EVENT_FLAG_DELETED)) {	    prev = cur;	    cur = cur->next;	    continue;	}	/* Unlink from list */	if (prev) {	    prev->next = cur->next;	} else {	    es->handlers = cur->next;	}	next = cur->next;	DestroyHandler(cur);	cur = next;    }}/*********************************************************************** %FUNCTION: Event_GetCallback* %ARGUMENTS:*  eh -- the event handler* %RETURNS:*  The callback function***********************************************************************/EventCallbackFuncEvent_GetCallback(EventHandler *eh){    return eh->fn;}/*********************************************************************** %FUNCTION: Event_GetData* %ARGUMENTS:*  eh -- the event handler* %RETURNS:*  The "data" field.***********************************************************************/void *Event_GetData(EventHandler *eh){    return eh->data;}/*********************************************************************** %FUNCTION: Event_SetCallbackAndData* %ARGUMENTS:*  eh -- the event handler*  fn -- new callback function*  data -- new data value* %RETURNS:*  Nothing* %DESCRIPTION:*  Sets the callback function and data fields.***********************************************************************/voidEvent_SetCallbackAndData(EventHandler *eh,			 EventCallbackFunc fn,			 void *data){    eh->fn = fn;    eh->data = data;}#ifdef DEBUG_EVENT#include <stdarg.h>#include <stdio.h>FILE *Event_DebugFP = NULL;/*********************************************************************** %FUNCTION: Event_DebugMsg* %ARGUMENTS:*  fmt, ... -- format string* %RETURNS:*  Nothing* %DESCRIPTION:*  Writes a debug message to the debug file.***********************************************************************/voidEvent_DebugMsg(char const *fmt, ...){    va_list ap;    struct timeval now;    if (!Event_DebugFP) return;    gettimeofday(&now, NULL);    fprintf(Event_DebugFP, "%03d.%03d ", (int) now.tv_sec % 1000,	    (int) now.tv_usec / 1000);    va_start(ap, fmt);    vfprintf(Event_DebugFP, fmt, ap);    va_end(ap);    fflush(Event_DebugFP);}#endif/*********************************************************************** %FUNCTION: Event_EnableDebugging* %ARGUMENTS:*  fname -- name of file to log debug messages to* %RETURNS:*  1 if debugging was enabled; 0 otherwise.***********************************************************************/intEvent_EnableDebugging(char const *fname){#ifndef DEBUG_EVENT    return 0;#else    Event_DebugFP = fopen(fname, "w");    return (Event_DebugFP != NULL);#endif}/*********************************************************************** %FUNCTION: Event_ChangeTimeout* %ARGUMENTS:*  h -- event handler*  t -- new timeout* %RETURNS:*  Nothing* %DESCRIPTION:*  Changes timeout of event handler to be "t" seconds in the future.***********************************************************************/voidEvent_ChangeTimeout(EventHandler *h, struct timeval t){    struct timeval now;    /* Check time interval for validity */    if (t.tv_sec < 0 || t.tv_usec < 0 || t.tv_usec >= 1000000) {	return;    }    /* Convert time interval to absolute time */    gettimeofday(&now, NULL);    t.tv_sec += now.tv_sec;    t.tv_usec += now.tv_usec;    if (t.tv_usec >= 1000000) {	t.tv_usec -= 1000000;	t.tv_sec++;    }    h->tmout = t;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -