Changeset 798 for trunk


Ignore:
Timestamp:
12/31/06 14:31:50 (5 years ago)
Author:
wd
Message:
  • Add a callback system implemented via macros.
  • Add callback support to sockets
  • Use the SCons determined SHLIBPREFIX and SHLIBSUFFIX for modules
  • Clean up queue.h (again) and add some new stuff from FreeBSD
Location:
trunk/ithildin
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/ithildin/include/ithildin/ithildin.h

    r787 r798  
    122122#endif 
    123123 
     124#include <ithildin/callback.h> 
    124125#include <ithildin/conf.h> 
    125126#include <ithildin/event.h> 
  • trunk/ithildin/include/ithildin/queue.h

    r630 r798  
    133133 * opted to remove the advertising provision. 
    134134 */ 
    135 /* 
     135 
     136/*- 
    136137 * Copyright (c) 1991, 1993 
    137  *        The Regents of the University of California.  All rights reserved. 
     138 *      The Regents of the University of California.  All rights reserved. 
    138139 * 
    139140 * Redistribution and use in source and binary forms, with or without 
     
    145146 *    notice, this list of conditions and the following disclaimer in the 
    146147 *    documentation and/or other materials provided with the distribution. 
    147  * 3. Neither the name of the University nor the names of its contributors 
     148 * 4. Neither the name of the University nor the names of its contributors 
    148149 *    may be used to endorse or promote products derived from this software 
    149150 *    without specific prior written permission. 
     
    161162 * SUCH DAMAGE. 
    162163 * 
    163  *        @(#)queue.h        8.5 (Berkeley) 8/20/94 
    164  * $FreeBSD: src/sys/sys/queue.h,v 1.54 2002/08/05 05:18:43 alfred Exp $ 
     164 *      @(#)queue.h     8.5 (Berkeley) 8/20/94 
     165 * $FreeBSD: src/sys/sys/queue.h,v 1.58.2.1 2005/01/31 23:26:57 imp Exp $ 
    165166 */ 
    166167 
     
    207208 * 
    208209 * 
    209  *                        SLIST    LIST     STAILQ   TAILQ 
    210  * _HEAD                  +        +        +        + 
    211  * _HEAD_INITIALIZER      +        +        +        + 
    212  * _ENTRY                 +        +        +        + 
    213  * _INIT                  +        +        +        + 
    214  * _EMPTY                 +        +        +        + 
    215  * _FIRST                 +        +        +        + 
    216  * _NEXT                  +        +        +        + 
    217  * _PREV                  -        -        -        + 
    218  * _LAST                  -        -        +        + 
    219  * _FOREACH               +        +        +        + 
    220  * _FOREACH_REVERSE       -        -        -        + 
    221  * _INSERT_HEAD           +        +        +        + 
    222  * _INSERT_BEFORE         -        +        -        + 
    223  * _INSERT_AFTER          +        +        +        + 
    224  * _INSERT_TAIL           -        -        +        + 
    225  * _CONCAT                -        -        +        + 
    226  * _REMOVE_HEAD           +        -        +        - 
    227  * _REMOVE                +        +        +        + 
    228  * 
    229  */ 
    230 #ifdef QUEUE_MACRO_DEBUG 
     210 *                              SLIST   LIST    STAILQ  TAILQ 
     211 * _HEAD                        +       +       +       + 
     212 * _HEAD_INITIALIZER            +       +       +       + 
     213 * _ENTRY                       +       +       +       + 
     214 * _INIT                        +       +       +       + 
     215 * _EMPTY                       +       +       +       + 
     216 * _FIRST                       +       +       +       + 
     217 * _NEXT                        +       +       +       + 
     218 * _PREV                        -       -       -       + 
     219 * _LAST                        -       -       +       + 
     220 * _FOREACH                     +       +       +       + 
     221 * _FOREACH_SAFE                +       +       +       + 
     222 * _FOREACH_REVERSE             -       -       -       + 
     223 * _FOREACH_REVERSE_SAFE        -       -       -       + 
     224 * _INSERT_HEAD                 +       +       +       + 
     225 * _INSERT_BEFORE               -       +       -       + 
     226 * _INSERT_AFTER                +       +       +       + 
     227 * _INSERT_TAIL                 -       -       +       + 
     228 * _CONCAT                      -       -       +       + 
     229 * _REMOVE_HEAD                 +       -       +       - 
     230 * _REMOVE                      +       +       +       + 
     231 * 
     232 */ 
     233#define QUEUE_MACRO_DEBUG 0 
     234#if QUEUE_MACRO_DEBUG 
    231235/* Store the last 2 places the queue element or head was altered */ 
    232236struct qm_trace { 
    233         char * lastfile; 
    234         int lastline; 
    235         char * prevfile; 
    236         int prevline; 
     237        char * lastfile; 
     238        int lastline; 
     239        char * prevfile; 
     240        int prevline; 
    237241}; 
    238242 
    239 #define TRACEBUF        struct qm_trace trace; 
    240 #define TRASHIT(x)        do {(x) = (void *)-1;} while (0) 
    241  
    242 #define QMD_TRACE_HEAD(head) do {                                              \ 
    243         (head)->trace.prevline = (head)->trace.lastline;                       \ 
    244         (head)->trace.prevfile = (head)->trace.lastfile;                       \ 
    245         (head)->trace.lastline = __LINE__;                                     \ 
    246         (head)->trace.lastfile = __FILE__;                                     \ 
    247 } while (0) 
    248  
    249 #define QMD_TRACE_ELEM(elem) do {                                              \ 
    250         (elem)->trace.prevline = (elem)->trace.lastline;                       \ 
    251         (elem)->trace.prevfile = (elem)->trace.lastfile;                       \ 
    252         (elem)->trace.lastline = __LINE__;                                     \ 
    253         (elem)->trace.lastfile = __FILE__;                                     \ 
     243#define TRACEBUF        struct qm_trace trace; 
     244#define TRASHIT(x)      do {(x) = (void *)-1;} while (0) 
     245 
     246#define QMD_TRACE_HEAD(head) do {                                       \ 
     247        (head)->trace.prevline = (head)->trace.lastline;                \ 
     248        (head)->trace.prevfile = (head)->trace.lastfile;                \ 
     249        (head)->trace.lastline = __LINE__;                              \ 
     250        (head)->trace.lastfile = __FILE__;                              \ 
     251} while (0) 
     252 
     253#define QMD_TRACE_ELEM(elem) do {                                       \ 
     254        (elem)->trace.prevline = (elem)->trace.lastline;                \ 
     255        (elem)->trace.prevfile = (elem)->trace.lastfile;                \ 
     256        (elem)->trace.lastline = __LINE__;                              \ 
     257        (elem)->trace.lastfile = __FILE__;                              \ 
    254258} while (0) 
    255259 
    256260#else 
    257 #define QMD_TRACE_ELEM(elem) 
    258 #define QMD_TRACE_HEAD(head) 
    259 #define TRACEBUF 
    260 #define TRASHIT(x) 
    261 #endif        /* QUEUE_MACRO_DEBUG */ 
     261#define QMD_TRACE_ELEM(elem) 
     262#define QMD_TRACE_HEAD(head) 
     263#define TRACEBUF 
     264#define TRASHIT(x) 
     265#endif  /* QUEUE_MACRO_DEBUG */ 
    262266 
    263267/* 
    264268 * Singly-linked List declarations. 
    265269 */ 
    266 #define        SLIST_HEAD(name, type)                                          \ 
    267 struct name {                                                                  \ 
    268         struct type *slh_first;        /* first element */                     \ 
    269 } 
    270  
    271 #define        SLIST_HEAD_INITIALIZER(head)                                    \ 
    272         { NULL } 
    273   
    274 #define        SLIST_ENTRY(type)                                               \ 
    275 struct {                                                                       \ 
    276         struct type *sle_next;        /* next element */                       \ 
    277 } 
    278   
     270#define SLIST_HEAD(name, type)                                          \ 
     271struct name {                                                           \ 
     272        struct type *slh_first; /* first element */                     \ 
     273} 
     274 
     275#define SLIST_HEAD_INITIALIZER(head)                                    \ 
     276        { NULL } 
     277 
     278#define SLIST_ENTRY(type)                                               \ 
     279struct {                                                                \ 
     280        struct type *sle_next;  /* next element */                      \ 
     281} 
     282 
    279283/* 
    280284 * Singly-linked List functions. 
    281285 */ 
    282 #define        SLIST_EMPTY(head)        ((head)->slh_first == NULL) 
    283  
    284 #define        SLIST_FIRST(head)        ((head)->slh_first) 
    285  
    286 #define        SLIST_FOREACH(var, head, field)                                 \ 
    287         for ((var) = SLIST_FIRST((head));                                      \ 
    288             (var);                                                             \ 
    289             (var) = SLIST_NEXT((var), field)) 
    290  
    291 #define SLIST_FOREACH_PREVPTR(var, varp, head, field)                          \ 
    292         for ((varp) = &SLIST_FIRST((head));                                    \ 
    293             ((var) = *(varp)) != NULL;                                         \ 
    294             (varp) = &SLIST_NEXT((var), field)) 
    295  
    296 #define        SLIST_INIT(head) do {                                           \ 
    297         SLIST_FIRST((head)) = NULL;                                            \ 
    298 } while (0) 
    299  
    300 #define        SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \ 
    301         SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);              \ 
    302         SLIST_NEXT((slistelm), field) = (elm);                                 \ 
    303 } while (0) 
    304  
    305 #define        SLIST_INSERT_HEAD(head, elm, field) do {                        \ 
    306         SLIST_NEXT((elm), field) = SLIST_FIRST((head));                        \ 
    307         SLIST_FIRST((head)) = (elm);                                           \ 
    308 } while (0) 
    309  
    310 #define        SLIST_NEXT(elm, field)        ((elm)->field.sle_next) 
    311  
    312 #define        SLIST_REMOVE(head, elm, type, field) do {                       \ 
    313         if (SLIST_FIRST((head)) == (elm)) {                                    \ 
    314                 SLIST_REMOVE_HEAD((head), field);                              \ 
    315         }                                                                      \ 
    316         else {                                                                 \ 
    317                 struct type *curelm = SLIST_FIRST((head));                     \ 
    318                 while (SLIST_NEXT(curelm, field) != (elm))                     \ 
    319                         curelm = SLIST_NEXT(curelm, field);                    \ 
    320                 SLIST_NEXT(curelm, field) =                                    \ 
    321                     SLIST_NEXT(SLIST_NEXT(curelm, field), field);              \ 
    322         }                                                                      \ 
    323 } while (0) 
    324  
    325 #define        SLIST_REMOVE_HEAD(head, field) do {                             \ 
    326         SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);          \ 
     286#define SLIST_EMPTY(head)       ((head)->slh_first == NULL) 
     287 
     288#define SLIST_FIRST(head)       ((head)->slh_first) 
     289 
     290#define SLIST_FOREACH(var, head, field)                                 \ 
     291        for ((var) = SLIST_FIRST((head));                               \ 
     292            (var);                                                      \ 
     293            (var) = SLIST_NEXT((var), field)) 
     294 
     295#define SLIST_FOREACH_SAFE(var, head, field, tvar)                      \ 
     296        for ((var) = SLIST_FIRST((head));                               \ 
     297            (var) && ((tvar) = SLIST_NEXT((var), field), 1);            \ 
     298            (var) = (tvar)) 
     299 
     300#define SLIST_FOREACH_PREVPTR(var, varp, head, field)                   \ 
     301        for ((varp) = &SLIST_FIRST((head));                             \ 
     302            ((var) = *(varp)) != NULL;                                  \ 
     303            (varp) = &SLIST_NEXT((var), field)) 
     304 
     305#define SLIST_INIT(head) do {                                           \ 
     306        SLIST_FIRST((head)) = NULL;                                     \ 
     307} while (0) 
     308 
     309#define SLIST_INSERT_AFTER(slistelm, elm, field) do {                   \ 
     310        SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);       \ 
     311        SLIST_NEXT((slistelm), field) = (elm);                          \ 
     312} while (0) 
     313 
     314#define SLIST_INSERT_HEAD(head, elm, field) do {                        \ 
     315        SLIST_NEXT((elm), field) = SLIST_FIRST((head));                 \ 
     316        SLIST_FIRST((head)) = (elm);                                    \ 
     317} while (0) 
     318 
     319#define SLIST_NEXT(elm, field)  ((elm)->field.sle_next) 
     320 
     321#define SLIST_REMOVE(head, elm, type, field) do {                       \ 
     322        if (SLIST_FIRST((head)) == (elm)) {                             \ 
     323                SLIST_REMOVE_HEAD((head), field);                       \ 
     324        }                                                               \ 
     325        else {                                                          \ 
     326                struct type *curelm = SLIST_FIRST((head));              \ 
     327                while (SLIST_NEXT(curelm, field) != (elm))              \ 
     328                        curelm = SLIST_NEXT(curelm, field);             \ 
     329                SLIST_NEXT(curelm, field) =                             \ 
     330                    SLIST_NEXT(SLIST_NEXT(curelm, field), field);       \ 
     331        }                                                               \ 
     332} while (0) 
     333 
     334#define SLIST_REMOVE_HEAD(head, field) do {                             \ 
     335        SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);   \ 
    327336} while (0) 
    328337 
     
    330339 * Singly-linked Tail queue declarations. 
    331340 */ 
    332 #define        STAILQ_HEAD(name, type)                                         \ 
    333 struct name {                                                                  \ 
    334         struct type *stqh_first;/* first element */                            \ 
    335         struct type **stqh_last;/* addr of last next element */                \ 
    336 } 
    337  
    338 #define        STAILQ_HEAD_INITIALIZER(head)                                   \ 
    339         { NULL, &(head).stqh_first } 
    340  
    341 #define        STAILQ_ENTRY(type)                                              \ 
    342 struct {                                                                       \ 
    343         struct type *stqe_next;        /* next element */                      \ 
     341#define STAILQ_HEAD(name, type)                                         \ 
     342struct name {                                                           \ 
     343        struct type *stqh_first;/* first element */                     \ 
     344        struct type **stqh_last;/* addr of last next element */         \ 
     345} 
     346 
     347#define STAILQ_HEAD_INITIALIZER(head)                                   \ 
     348        { NULL, &(head).stqh_first } 
     349 
     350#define STAILQ_ENTRY(type)                                              \ 
     351struct {                                                                \ 
     352        struct type *stqe_next; /* next element */                      \ 
    344353} 
    345354 
     
    347356 * Singly-linked Tail queue functions. 
    348357 */ 
    349 #define        STAILQ_CONCAT(head1, head2) do {                                \ 
    350         if (!STAILQ_EMPTY((head2))) {                                          \ 
    351                 *(head1)->stqh_last = (head2)->stqh_first;                     \ 
    352                 (head1)->stqh_last = (head2)->stqh_last;                       \ 
    353                 STAILQ_INIT((head2));                                          \ 
    354         }                                                                      \ 
    355 } while (0) 
    356  
    357 #define        STAILQ_EMPTY(head)        ((head)->stqh_first == NULL) 
    358  
    359 #define        STAILQ_FIRST(head)        ((head)->stqh_first) 
    360  
    361 #define        STAILQ_FOREACH(var, head, field)                                \ 
    362         for((var) = STAILQ_FIRST((head));                                      \ 
    363            (var);                                                              \ 
    364            (var) = STAILQ_NEXT((var), field)) 
    365  
    366 #define        STAILQ_INIT(head) do {                                          \ 
    367         STAILQ_FIRST((head)) = NULL;                                           \ 
    368         (head)->stqh_last = &STAILQ_FIRST((head));                             \ 
    369 } while (0) 
    370  
    371 #define        STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {               \ 
    372         if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL) \ 
    373                 (head)->stqh_last = &STAILQ_NEXT((elm), field);                \ 
    374         STAILQ_NEXT((tqelm), field) = (elm);                                   \ 
    375 } while (0) 
    376  
    377 #define        STAILQ_INSERT_HEAD(head, elm, field) do {                       \ 
    378         if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)        \ 
    379                 (head)->stqh_last = &STAILQ_NEXT((elm), field);                \ 
    380         STAILQ_FIRST((head)) = (elm);                                          \ 
    381 } while (0) 
    382  
    383 #define        STAILQ_INSERT_TAIL(head, elm, field) do {                       \ 
    384         STAILQ_NEXT((elm), field) = NULL;                                      \ 
    385         *(head)->stqh_last = (elm);                                            \ 
    386         (head)->stqh_last = &STAILQ_NEXT((elm), field);                        \ 
    387 } while (0) 
    388  
    389 #define        STAILQ_LAST(head, type, field)                                  \ 
    390         (STAILQ_EMPTY((head)) ?                                                \ 
    391                 NULL :                                                         \ 
    392                 ((struct type *)                                               \ 
    393                 ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) 
    394  
    395 #define        STAILQ_NEXT(elm, field)        ((elm)->field.stqe_next) 
    396  
    397 #define        STAILQ_REMOVE(head, elm, type, field) do {                      \ 
    398         if (STAILQ_FIRST((head)) == (elm)) {                                   \ 
    399                 STAILQ_REMOVE_HEAD((head), field);                             \ 
    400         }                                                                      \ 
    401         else {                                                                 \ 
    402                 struct type *curelm = STAILQ_FIRST((head));                    \ 
    403                 while (STAILQ_NEXT(curelm, field) != (elm))                    \ 
    404                         curelm = STAILQ_NEXT(curelm, field);                   \ 
    405                 if ((STAILQ_NEXT(curelm, field) =                              \ 
    406                      STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)  \ 
    407                         (head)->stqh_last = &STAILQ_NEXT((curelm), field);     \ 
    408         }                                                                      \ 
    409 } while (0) 
    410  
    411 #define        STAILQ_REMOVE_HEAD(head, field) do {                            \ 
    412         if ((STAILQ_FIRST((head)) =                                            \ 
    413              STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)                \ 
    414                 (head)->stqh_last = &STAILQ_FIRST((head));                     \ 
    415 } while (0) 
    416  
    417 #define        STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {                 \ 
    418         if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL)        \ 
    419                 (head)->stqh_last = &STAILQ_FIRST((head));                     \ 
     358#define STAILQ_CONCAT(head1, head2) do {                                \ 
     359        if (!STAILQ_EMPTY((head2))) {                                   \ 
     360                *(head1)->stqh_last = (head2)->stqh_first;              \ 
     361                (head1)->stqh_last = (head2)->stqh_last;                \ 
     362                STAILQ_INIT((head2));                                   \ 
     363        }                                                               \ 
     364} while (0) 
     365 
     366#define STAILQ_EMPTY(head)      ((head)->stqh_first == NULL) 
     367 
     368#define STAILQ_FIRST(head)      ((head)->stqh_first) 
     369 
     370#define STAILQ_FOREACH(var, head, field)                                \ 
     371        for((var) = STAILQ_FIRST((head));                               \ 
     372           (var);                                                       \ 
     373           (var) = STAILQ_NEXT((var), field)) 
     374 
     375 
     376#define STAILQ_FOREACH_SAFE(var, head, field, tvar)                     \ 
     377        for ((var) = STAILQ_FIRST((head));                              \ 
     378            (var) && ((tvar) = STAILQ_NEXT((var), field), 1);           \ 
     379            (var) = (tvar)) 
     380 
     381#define STAILQ_INIT(head) do {                                          \ 
     382        STAILQ_FIRST((head)) = NULL;                                    \ 
     383        (head)->stqh_last = &STAILQ_FIRST((head));                      \ 
     384} while (0) 
     385 
     386#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {               \ 
     387        if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ 
     388                (head)->stqh_last = &STAILQ_NEXT((elm), field);         \ 
     389        STAILQ_NEXT((tqelm), field) = (elm);                            \ 
     390} while (0) 
     391 
     392#define STAILQ_INSERT_HEAD(head, elm, field) do {                       \ 
     393        if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ 
     394                (head)->stqh_last = &STAILQ_NEXT((elm), field);         \ 
     395        STAILQ_FIRST((head)) = (elm);                                   \ 
     396} while (0) 
     397 
     398#define STAILQ_INSERT_TAIL(head, elm, field) do {                       \ 
     399        STAILQ_NEXT((elm), field) = NULL;                               \ 
     400        *(head)->stqh_last = (elm);                                     \ 
     401        (head)->stqh_last = &STAILQ_NEXT((elm), field);                 \ 
     402} while (0) 
     403 
     404#define STAILQ_LAST(head, type, field)                                  \ 
     405        (STAILQ_EMPTY((head)) ?                                         \ 
     406                NULL :                                                  \ 
     407                ((struct type *)                                        \ 
     408                ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) 
     409 
     410#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) 
     411 
     412#define STAILQ_REMOVE(head, elm, type, field) do {                      \ 
     413        if (STAILQ_FIRST((head)) == (elm)) {                            \ 
     414                STAILQ_REMOVE_HEAD((head), field);                      \ 
     415        }                                                               \ 
     416        else {                                                          \ 
     417                struct type *curelm = STAILQ_FIRST((head));             \ 
     418                while (STAILQ_NEXT(curelm, field) != (elm))             \ 
     419                        curelm = STAILQ_NEXT(curelm, field);            \ 
     420                if ((STAILQ_NEXT(curelm, field) =                       \ 
     421                     STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\ 
     422                        (head)->stqh_last = &STAILQ_NEXT((curelm), field);\ 
     423        }                                                               \ 
     424} while (0) 
     425 
     426#define STAILQ_REMOVE_HEAD(head, field) do {                            \ 
     427        if ((STAILQ_FIRST((head)) =                                     \ 
     428             STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)         \ 
     429                (head)->stqh_last = &STAILQ_FIRST((head));              \ 
     430} while (0) 
     431 
     432#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {                 \ 
     433        if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ 
     434                (head)->stqh_last = &STAILQ_FIRST((head));              \ 
    420435} while (0) 
    421436 
     
    423438 * List declarations. 
    424439 */ 
    425 #define        LIST_HEAD(name, type)                                           \ 
    426 struct name {                                                                  \ 
    427         struct type *lh_first;        /* first element */                      \ 
    428 } 
    429  
    430 #define        LIST_HEAD_INITIALIZER(head)                                     \ 
    431         { NULL } 
    432  
    433 #define        LIST_ENTRY(type)                                                \ 
    434 struct {                                                                       \ 
    435         struct type *le_next;        /* next element */                        \ 
    436         struct type **le_prev;        /* address of previous next element */   \ 
     440#define LIST_HEAD(name, type)                                           \ 
     441struct name {                                                           \ 
     442        struct type *lh_first;  /* first element */                     \ 
     443} 
     444 
     445#define LIST_HEAD_INITIALIZER(head)                                     \ 
     446        { NULL } 
     447 
     448#define LIST_ENTRY(type)                                                \ 
     449struct {                                                                \ 
     450        struct type *le_next;   /* next element */                      \ 
     451        struct type **le_prev;  /* address of previous next element */  \ 
    437452} 
    438453 
     
    441456 */ 
    442457 
    443 #define        LIST_EMPTY(head)        ((head)->lh_first == NULL) 
    444  
    445 #define        LIST_FIRST(head)        ((head)->lh_first) 
    446  
    447 #define        LIST_FOREACH(var, head, field)                                  \ 
    448         for ((var) = LIST_FIRST((head));                                       \ 
    449             (var);                                                             \ 
    450             (var) = LIST_NEXT((var), field)) 
    451  
    452 #define        LIST_INIT(head) do {                                            \ 
    453         LIST_FIRST((head)) = NULL;                                             \ 
    454 } while (0) 
    455  
    456 #define        LIST_INSERT_AFTER(listelm, elm, field) do {                     \ 
    457         if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)   \ 
    458                 LIST_NEXT((listelm), field)->field.le_prev =                   \ 
    459                     &LIST_NEXT((elm), field);                                  \ 
    460         LIST_NEXT((listelm), field) = (elm);                                   \ 
    461         (elm)->field.le_prev = &LIST_NEXT((listelm), field);                   \ 
    462 } while (0) 
    463  
    464 #define        LIST_INSERT_BEFORE(listelm, elm, field) do {                    \ 
    465         (elm)->field.le_prev = (listelm)->field.le_prev;                       \ 
    466         LIST_NEXT((elm), field) = (listelm);                                   \ 
    467         *(listelm)->field.le_prev = (elm);                                     \ 
    468         (listelm)->field.le_prev = &LIST_NEXT((elm), field);                   \ 
    469 } while (0) 
    470  
    471 #define        LIST_INSERT_HEAD(head, elm, field) do {                         \ 
    472         if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)            \ 
    473                 LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);  \ 
    474         LIST_FIRST((head)) = (elm);                                            \ 
    475         (elm)->field.le_prev = &LIST_FIRST((head));                            \ 
    476 } while (0) 
    477  
    478 #define        LIST_NEXT(elm, field)        ((elm)->field.le_next) 
    479  
    480 #define        LIST_REMOVE(elm, field) do {                                    \ 
    481         if (LIST_NEXT((elm), field) != NULL)                                   \ 
    482                 LIST_NEXT((elm), field)->field.le_prev =                       \ 
    483                     (elm)->field.le_prev;                                      \ 
    484         *(elm)->field.le_prev = LIST_NEXT((elm), field);                       \ 
     458#define LIST_EMPTY(head)        ((head)->lh_first == NULL) 
     459 
     460#define LIST_FIRST(head)        ((head)->lh_first) 
     461 
     462#define LIST_FOREACH(var, head, field)                                  \ 
     463        for ((var) = LIST_FIRST((head));                                \ 
     464            (var);                                                      \ 
     465            (var) = LIST_NEXT((var), field)) 
     466 
     467#define LIST_FOREACH_SAFE(var, head, field, tvar)                       \ 
     468        for ((var) = LIST_FIRST((head));                                \ 
     469            (var) && ((tvar) = LIST_NEXT((var), field), 1);             \ 
     470            (var) = (tvar)) 
     471 
     472#define LIST_INIT(head) do {                                            \ 
     473        LIST_FIRST((head)) = NULL;                                      \ 
     474} while (0) 
     475 
     476#define LIST_INSERT_AFTER(listelm, elm, field) do {                     \ 
     477        if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ 
     478                LIST_NEXT((listelm), field)->field.le_prev =            \ 
     479                    &LIST_NEXT((elm), field);                           \ 
     480        LIST_NEXT((listelm), field) = (elm);                            \ 
     481        (elm)->field.le_prev = &LIST_NEXT((listelm), field);            \ 
     482} while (0) 
     483 
     484#define LIST_INSERT_BEFORE(listelm, elm, field) do {                    \ 
     485        (elm)->field.le_prev = (listelm)->field.le_prev;                \ 
     486        LIST_NEXT((elm), field) = (listelm);                            \ 
     487        *(listelm)->field.le_prev = (elm);                              \ 
     488        (listelm)->field.le_prev = &LIST_NEXT((elm), field);            \ 
     489} while (0) 
     490 
     491#define LIST_INSERT_HEAD(head, elm, field) do {                         \ 
     492        if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)     \ 
     493                LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ 
     494        LIST_FIRST((head)) = (elm);                                     \ 
     495        (elm)->field.le_prev = &LIST_FIRST((head));                     \ 
     496} while (0) 
     497 
     498#define LIST_NEXT(elm, field)   ((elm)->field.le_next) 
     499 
     500#define LIST_REMOVE(elm, field) do {                                    \ 
     501        if (LIST_NEXT((elm), field) != NULL)                            \ 
     502                LIST_NEXT((elm), field)->field.le_prev =                \ 
     503                    (elm)->field.le_prev;                               \ 
     504        *(elm)->field.le_prev = LIST_NEXT((elm), field);                \ 
    485505} while (0) 
    486506 
     
    488508 * Tail queue declarations. 
    489509 */ 
    490 #define        TAILQ_HEAD(name, type)                                          \ 
    491 struct name {                                                                  \ 
    492         struct type *tqh_first;        /* first element */                     \ 
    493         struct type **tqh_last;        /* addr of last next element */         \ 
    494         TRACEBUF                                                               \ 
    495 } 
    496  
    497 #define        TAILQ_HEAD_INITIALIZER(head)                                    \ 
    498         { NULL, &(head).tqh_first } 
    499  
    500 #define        TAILQ_ENTRY(type)                                               \ 
    501 struct {                                                                       \ 
    502         struct type *tqe_next;         /* next element */                      \ 
    503         struct type **tqe_prev;        /* address of previous next element */  \ 
    504         TRACEBUF                                                               \ 
     510#define TAILQ_HEAD(name, type)                                          \ 
     511struct name {                                                           \ 
     512        struct type *tqh_first; /* first element */                     \ 
     513        struct type **tqh_last; /* addr of last next element */         \ 
     514        TRACEBUF                                                        \ 
     515} 
     516 
     517#define TAILQ_HEAD_INITIALIZER(head)                                    \ 
     518        { NULL, &(head).tqh_first } 
     519 
     520#define TAILQ_ENTRY(type)                                               \ 
     521struct {                                                                \ 
     522        struct type *tqe_next;  /* next element */                      \ 
     523        struct type **tqe_prev; /* address of previous next element */  \ 
     524        TRACEBUF                                                        \ 
    505525} 
    506526 
     
    508528 * Tail queue functions. 
    509529 */ 
    510 #define        TAILQ_CONCAT(head1, head2, field) do {                          \ 
    511         if (!TAILQ_EMPTY(head2)) {                                             \ 
    512                 *(head1)->tqh_last = (head2)->tqh_first;                       \ 
    513                 (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;        \ 
    514                 (head1)->tqh_last = (head2)->tqh_last;                         \ 
    515                 TAILQ_INIT((head2));                                           \ 
    516                 QMD_TRACE_HEAD(head);                                          \ 
    517                 QMD_TRACE_HEAD(head2);                                         \ 
    518         }                                                                      \ 
    519 } while (0) 
    520  
    521 #define        TAILQ_EMPTY(head)        ((head)->tqh_first == NULL) 
    522  
    523 #define        TAILQ_FIRST(head)        ((head)->tqh_first) 
    524  
    525 #define        TAILQ_FOREACH(var, head, field)                                 \ 
    526         for ((var) = TAILQ_FIRST((head));                                      \ 
    527             (var);                                                             \ 
    528             (var) = TAILQ_NEXT((var), field)) 
    529  
    530 #define        TAILQ_FOREACH_REVERSE(var, head, headname, field)               \ 
    531         for ((var) = TAILQ_LAST((head), headname);                             \ 
    532             (var);                                                             \ 
    533             (var) = TAILQ_PREV((var), headname, field)) 
    534  
    535 #define        TAILQ_INIT(head) do {                                           \ 
    536         TAILQ_FIRST((head)) = NULL;                                            \ 
    537         (head)->tqh_last = &TAILQ_FIRST((head));                               \ 
    538         QMD_TRACE_HEAD(head);                                                  \ 
    539 } while (0) 
    540  
    541 #define        TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \ 
    542         if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL) \ 
    543                 TAILQ_NEXT((elm), field)->field.tqe_prev =                     \ 
    544                     &TAILQ_NEXT((elm), field);                                 \ 
    545         else {                                                                 \ 
    546                 (head)->tqh_last = &TAILQ_NEXT((elm), field);                  \ 
    547                 QMD_TRACE_HEAD(head);                                          \ 
    548         }                                                                      \ 
    549         TAILQ_NEXT((listelm), field) = (elm);                                  \ 
    550         (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);                 \ 
    551         QMD_TRACE_ELEM(&(elm)->field);                                         \ 
    552         QMD_TRACE_ELEM(&listelm->field);                                       \ 
    553 } while (0) 
    554  
    555 #define        TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \ 
    556         (elm)->field.tqe_prev = (listelm)->field.tqe_prev;                     \ 
    557         TAILQ_NEXT((elm), field) = (listelm);                                  \ 
    558         *(listelm)->field.tqe_prev = (elm);                                    \ 
    559         (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);                 \ 
    560         QMD_TRACE_ELEM(&(elm)->field);                                         \ 
    561         QMD_TRACE_ELEM(&listelm->field);                                       \ 
    562 } while (0) 
    563  
    564 #define        TAILQ_INSERT_HEAD(head, elm, field) do {                        \ 
    565         if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)          \ 
    566                 TAILQ_FIRST((head))->field.tqe_prev =                          \ 
    567                     &TAILQ_NEXT((elm), field);                                 \ 
    568         else                                                                   \ 
    569                 (head)->tqh_last = &TAILQ_NEXT((elm), field);                  \ 
    570         TAILQ_FIRST((head)) = (elm);                                           \ 
    571         (elm)->field.tqe_prev = &TAILQ_FIRST((head));                          \ 
    572         QMD_TRACE_HEAD(head);                                                  \ 
    573         QMD_TRACE_ELEM(&(elm)->field);                                         \ 
    574 } while (0) 
    575  
    576 #define        TAILQ_INSERT_TAIL(head, elm, field) do {                        \ 
    577         TAILQ_NEXT((elm), field) = NULL;                                       \ 
    578         (elm)->field.tqe_prev = (head)->tqh_last;                              \ 
    579         *(head)->tqh_last = (elm);                                             \ 
    580         (head)->tqh_last = &TAILQ_NEXT((elm), field);                          \ 
    581         QMD_TRACE_HEAD(head);                                                  \ 
    582         QMD_TRACE_ELEM(&(elm)->field);                                         \ 
    583 } while (0) 
    584  
    585 #define        TAILQ_LAST(head, headname)                                      \ 
    586         (*(((struct headname *)((head)->tqh_last))->tqh_last)) 
    587  
    588 #define        TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 
    589  
    590 #define        TAILQ_PREV(elm, headname, field)                                \ 
    591         (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 
    592  
    593 #define        TAILQ_REMOVE(head, elm, field) do {                             \ 
    594         if ((TAILQ_NEXT((elm), field)) != NULL)                                \ 
    595                 TAILQ_NEXT((elm), field)->field.tqe_prev =                     \ 
    596                     (elm)->field.tqe_prev;                                     \ 
    597         else {                                                                 \ 
    598                 (head)->tqh_last = (elm)->field.tqe_prev;                      \ 
    599                 QMD_TRACE_HEAD(head);                                          \ 
    600         }                                                                      \ 
    601         *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);                     \ 
    602         TRASHIT((elm)->field.tqe_next);                                        \ 
    603         TRASHIT((elm)->field.tqe_prev);                                        \ 
    604         QMD_TRACE_ELEM(&(elm)->field);                                         \ 
    605 } while (0) 
    606  
    607 #endif /* !QUEUE_H */ 
     530#define TAILQ_CONCAT(head1, head2, field) do {                          \ 
     531        if (!TAILQ_EMPTY(head2)) {                                      \ 
     532                *(head1)->tqh_last = (head2)->tqh_first;                \ 
     533                (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ 
     534                (head1)->tqh_last = (head2)->tqh_last;                  \ 
     535                TAILQ_INIT((head2));                                    \ 
     536                QMD_TRACE_HEAD(head);                                   \ 
     537                QMD_TRACE_HEAD(head2);                                  \ 
     538        }                                                               \ 
     539} while (0) 
     540 
     541#define TAILQ_EMPTY(head)       ((head)->tqh_first == NULL) 
     542 
     543#define TAILQ_FIRST(head)       ((head)->tqh_first) 
     544 
     545#define TAILQ_FOREACH(var, head, field)                                 \ 
     546        for ((var) = TAILQ_FIRST((head));                               \ 
     547            (var);                                                      \ 
     548            (var) = TAILQ_NEXT((var), field)) 
     549 
     550#define TAILQ_FOREACH_SAFE(var, head, field, tvar)                      \ 
     551        for ((var) = TAILQ_FIRST((head));                               \ 
     552            (var) && ((tvar) = TAILQ_NEXT((var), field), 1);            \ 
     553            (var) = (tvar)) 
     554 
     555#define TAILQ_FOREACH_REVERSE(var, head, headname, field)               \ 
     556        for ((var) = TAILQ_LAST((head), headname);                      \ 
     557            (var);                                                      \ 
     558            (var) = TAILQ_PREV((var), headname, field)) 
     559 
     560#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)    \ 
     561        for ((var) = TAILQ_LAST((head), headname);                      \ 
     562            (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);  \ 
     563            (var) = (tvar)) 
     564 
     565#define TAILQ_INIT(head) do {                                           \ 
     566        TAILQ_FIRST((head)) = NULL;                                     \ 
     567        (head)->tqh_last = &TAILQ_FIRST((head));                        \ 
     568        QMD_TRACE_HEAD(head);                                           \ 
     569} while (0) 
     570 
     571#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {              \ 
     572        if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ 
     573                TAILQ_NEXT((elm), field)->field.tqe_prev =              \ 
     574                    &TAILQ_NEXT((elm), field);                          \ 
     575        else {                                                          \ 
     576                (head)->tqh_last = &TAILQ_NEXT((elm), field);           \ 
     577                QMD_TRACE_HEAD(head);                                   \ 
     578        }                                                               \ 
     579        TAILQ_NEXT((listelm), field) = (elm);                           \ 
     580        (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);          \ 
     581        QMD_TRACE_ELEM(&(elm)->field);                                  \ 
     582        QMD_TRACE_ELEM(&listelm->field);                                \ 
     583} while (0) 
     584 
     585#define TAILQ_INSERT_BEFORE(listelm, elm, field) do {                   \ 
     586        (elm)->field.tqe_prev = (listelm)->field.tqe_prev;              \ 
     587        TAILQ_NEXT((elm), field) = (listelm);                           \ 
     588        *(listelm)->field.tqe_prev = (elm);                             \ 
     589        (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);          \ 
     590        QMD_TRACE_ELEM(&(elm)->field);                                  \ 
     591        QMD_TRACE_ELEM(&listelm->field);                                \ 
     592} while (0) 
     593 
     594#define TAILQ_INSERT_HEAD(head, elm, field) do {                        \ 
     595        if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)   \ 
     596                TAILQ_FIRST((head))->field.tqe_prev =                   \ 
     597                    &TAILQ_NEXT((elm), field);                          \ 
     598        else                                                            \ 
     599                (head)->tqh_last = &TAILQ_NEXT((elm), field);           \ 
     600        TAILQ_FIRST((head)) = (elm);                                    \ 
     601        (elm)->field.tqe_prev = &TAILQ_FIRST((head));                   \ 
     602        QMD_TRACE_HEAD(head);                                           \ 
     603        QMD_TRACE_ELEM(&(elm)->field);                                  \ 
     604} while (0) 
     605 
     606#define TAILQ_INSERT_TAIL(head, elm, field) do {                        \ 
     607        TAILQ_NEXT((elm), field) = NULL;                                \ 
     608        (elm)->field.tqe_prev = (head)->tqh_last;                       \ 
     609        *(head)->tqh_last = (elm);                                      \ 
     610        (head)->tqh_last = &TAILQ_NEXT((elm), field);                   \ 
     611        QMD_TRACE_HEAD(head);                                           \ 
     612        QMD_TRACE_ELEM(&(elm)->field);                                  \ 
     613} while (0) 
     614 
     615#define TAILQ_LAST(head, headname)                                      \ 
     616        (*(((struct headname *)((head)->tqh_last))->tqh_last)) 
     617 
     618#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) 
     619 
     620#define TAILQ_PREV(elm, headname, field)                                \ 
     621        (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) 
     622 
     623#define TAILQ_REMOVE(head, elm, field) do {                             \ 
     624        if ((TAILQ_NEXT((elm), field)) != NULL)                         \ 
     625                TAILQ_NEXT((elm), field)->field.tqe_prev =              \ 
     626                    (elm)->field.tqe_prev;                              \ 
     627        else {                                                          \ 
     628                (head)->tqh_last = (elm)->field.tqe_prev;               \ 
     629                QMD_TRACE_HEAD(head);                                   \ 
     630        }                                                               \ 
     631        *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);              \ 
     632        TRASHIT((elm)->field.tqe_next);                                 \ 
     633        TRASHIT((elm)->field.tqe_prev);                                 \ 
     634        QMD_TRACE_ELEM(&(elm)->field);                                  \ 
     635} while (0) 
     636 
     637#endif 
  • trunk/ithildin/include/ithildin/socket.h

    r787 r798  
    3737 
    3838struct isocket { 
     39    CALLBACK_SAFE; 
     40 
    3941    int            fd;                    /* file descriptor */ 
    4042#ifdef HAVE_OPENSSL 
  • trunk/ithildin/lib/SConscript

    r790 r798  
    1616# Build specification for the ithildin library 
    1717env.Install(env['libdir'], 
    18     env.SharedLibrary(target = 'ithildin',  source = Split(''' 
    19        conf.c 
    20        event.c 
    21        global.c 
    22        hash.c 
    23        log.c 
    24        malloc.c 
    25        md5.c 
    26        module.c 
    27        socket.c 
    28        string.c 
    29        timer.c 
    30        util.c 
    31        ''') 
     18    env.SharedLibrary(target = 'ithildin', 
     19        source = Split(''' 
     20conf.c event.c global.c hash.c log.c malloc.c md5.c module.c socket.c string.c 
     21timer.c util.c 
     22        '''), 
     23    CPPDEFINES = env['CPPDEFINES'] + Split(r''' 
     24SHLIBPREFIX="\"%s\"" 
     25SHLIBSUFFIX="\"%s\"" 
     26        ''' % (env['SHLIBPREFIX'], env['SHLIBSUFFIX'])) 
    3227    ) 
    3328) 
  • trunk/ithildin/lib/module.c

    r787 r798  
    1818#endif 
    1919 
    20 /* filename extension for modules, will become variable when multiple 
    21  * platforms become supported. */ 
    22 #define MODULE_EXTENSION ".so" 
    23  
    2420/* create a module structure. */ 
    2521static module_t *add_module_from_config(conf_entry_t *); 
    2622static module_t *create_module(char *); 
    2723static void destroy_module(module_t *); 
     24static bool load_module_deps(module_t *, char **, int, bool); 
    2825 
    2926/* this is called both at start-up and at any time when the conf is reloaded 
     
    6158    /* now load modules which requested autoloading.  we do this here instead 
    6259     * of above so we can read in all the module data before we load 
    63      * anything.  very handy, incidentally, modules are loaded in reverse 
    64      * order from the file.  hopefully that won't matter to anyone :) */ 
     60     * anything. */  
    6561    LIST_FOREACH(m, &me.modules, lp) { 
    6662        if (m->flags & MODULE_FL_AUTOLOAD && !(m->flags & MODULE_FL_LOADED)) 
     
    182178int load_module(char *name, int flags) { 
    183179    module_t *m = NULL; 
    184     /* never ask for explicit symbol resolution.  every library a module 
     180    /* always ask for explicit symbol resolution.  every library a module 
    185181     * depends on should be *already linked against* the module in question. 
    186182     * we do not provide symbol help (because it is not reliably 
     
    248244        return 0; 
    249245    } 
    250  
    251     deplist = (char **)dlsym(m->handle, "mdepends"); 
    252246 
    253247    sn = strrchr(m->name, '/'); 
     
    288282    m->flags |= MODULE_FL_LOADED | flags; 
    289283 
    290     while (deplist != NULL && *deplist != NULL) { 
    291         module_t *m2 = find_module(*deplist); 
    292         if (m2 == NULL || !(m2->flags & MODULE_FL_DEPENDLOAD)) { 
    293             if (m2 == NULL) 
    294                 log_notice("loading dependant module %s for %s", *deplist, name); 
    295             if (!load_module(*deplist, flags | MODULE_FL_DEPENDLOAD | 
    296                     MODULE_FL_CREATE | MODULE_FL_QUIET)) { 
    297                 log_error("loading dependant failed, giving up for %s!", name); 
    298                 unload_module(m->name); 
    299                 return 0; 
    300             } 
    301             m2 = find_module(*deplist); 
    302         } 
    303         /* m2 now definitely exists (yay) */ 
    304         mdep = malloc(sizeof(struct module_dependency)); 
    305         mdep->mod = m; 
    306         LIST_INSERT_HEAD(&m2->deps, mdep, lp); 
    307         deplist++; /* and onto the next one */ 
    308     } 
    309  
     284    if ((deplist = (char **)dlsym(m->handle, "mdepends")) != NULL) { 
     285        if (!load_module_deps(m, deplist, flags, true)) { 
     286            unload_module(m->name); 
     287            return 0; 
     288        } 
     289    } 
     290    if ((deplist = (char **)dlsym(m->handle, "msoftdepends")) != NULL) { 
     291        if (!load_module_deps(m, deplist, flags, false)) 
     292            log_warn("some soft dependencies for %s failed to load, " 
     293                     "continuing anyway.", m->name); 
     294    } 
    310295 
    311296    /* okay, hopefully this will stay here.  I've decided to hook the 
     
    353338 
    354339    return 1; 
     340} 
     341 
     342static bool load_module_deps(module_t *m, char **deplist, int flags, 
     343        bool hardfail) { 
     344    module_t *m2; 
     345    bool allok = true; 
     346    struct module_dependency *mdep; 
     347 
     348    while (deplist != NULL && *deplist != NULL) { 
     349        m2 = find_module(*deplist); 
     350        if (m2 == NULL || !(m2->flags & MODULE_FL_DEPENDLOAD)) { 
     351            if (m2 == NULL) 
     352                log_notice("loading dependant module %s for %s", *deplist, 
     353                        m->name); 
     354            if (!load_module(*deplist, flags | MODULE_FL_DEPENDLOAD | 
     355                    MODULE_FL_CREATE | MODULE_FL_QUIET)) { 
     356                if (hardfail == true) 
     357                    return false; 
     358                else 
     359                    allok = false; 
     360            } 
     361            m2 = find_module(*deplist); 
     362        } 
     363        deplist++; /* move on to next module */ 
     364 
     365        if (hardfail) { 
     366            /* m2 is guaranteed in this case */ 
     367            mdep = malloc(sizeof(struct module_dependency)); 
     368            mdep->mod = m; 
     369            LIST_INSERT_HEAD(&m2->deps, mdep, lp); 
     370        } else 
     371            continue; /* do not link soft dependencies */ 
     372    } 
     373 
     374    return allok; 
    355375} 
    356376 
     
    547567    m->fullpath = malloc(PATH_MAX); 
    548568    m->name = strdup(name); 
    549     /* strip off the extension */ 
    550     if (MODULE_EXTENSION[0]) { 
    551         s = strrchr(m->name, MODULE_EXTENSION[0]); 
     569 
     570    /* strip off the prefix and suffix, if they exist. */ 
     571    if (SHLIBPREFIX[0]) { 
     572        size_t pfxlen = strlen(SHLIBPREFIX); 
     573        size_t namelen = strlen(m->name); 
     574        if (!strncasecmp(m->name, SHLIBPREFIX, pfxlen)) { 
     575            memmove(m->name, m->name + pfxlen, namelen - pfxlen); 
     576            m->name[namelen - pfxlen] = '\0'; 
     577        } 
     578    } 
     579    if (SHLIBSUFFIX[0]) { 
     580        s = strrchr(m->name, SHLIBSUFFIX[0]); 
    552581        if (s != NULL) { 
    553             if (!strcmp(s, MODULE_EXTENSION)) 
     582            if (!strcmp(s, SHLIBSUFFIX)) 
    554583                *s = '\0'; 
    555584        } 
    556585    } 
    557586 
    558     sprintf(m->fullpath, "%s/%s" MODULE_EXTENSION, me.lib_path, m->name); 
     587    sprintf(m->fullpath, "%s/%s%s%s", me.lib_path, SHLIBPREFIX, m->name, 
     588            SHLIBSUFFIX); 
    559589    if (access(m->fullpath, R_OK | X_OK) == -1) { 
    560590        log_error("unable to open module %s from %s: %s", m->name, 
  • trunk/ithildin/lib/socket.c

    r787 r798  
    172172 
    173173    /* we only close the socket and mark it as dead, we reap dead sockets after 
    174      * the polling phase.  see reap_dead_sockets() */ 
     174     * the polling phase.  see reap_dead_sockets().  That said we do go 
     175     * ahead and cancel all callbacks for the socket immediately. */ 
     176    callback_cancel(sock); 
    175177    close_socket(sock); 
    176178    sock->state |= SOCKET_FL_DEAD; 
Note: See TracChangeset for help on using the changeset viewer.