[BACK]Return to worklist.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / rcs

Annotation of src/usr.bin/rcs/worklist.c, Revision 1.4

1.4     ! nicm        1: /*     $OpenBSD: worklist.c,v 1.3 2010/07/23 08:31:19 ray Exp $        */
1.1       joris       2: /*
                      3:  * Copyright (c) 2006 Joris Vink <joris@openbsd.org>
                      4:  * All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  *
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. The name of the author may not be used to endorse or promote products
                     13:  *    derived from this software without specific prior written permission.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
                     16:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
                     17:  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
                     18:  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     19:  * EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     20:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
                     21:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
                     22:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
                     23:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
                     24:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     25:  */
                     26:
1.2       xsa        27: #include <sys/queue.h>
                     28:
                     29: #include <err.h>
                     30: #include <signal.h>
1.4     ! nicm       31: #include <stdlib.h>
1.2       xsa        32: #include <string.h>
                     33: #include <unistd.h>
1.1       joris      34:
                     35: #include "worklist.h"
                     36: #include "xmalloc.h"
                     37:
                     38: /*
                     39:  * adds a path to a worklist.
                     40:  */
                     41: void
1.3       ray        42: worklist_add(const char *path, struct wklhead *worklist)
1.1       joris      43: {
                     44:        size_t len;
1.3       ray        45:        struct worklist *wkl;
1.1       joris      46:        sigset_t old, new;
                     47:
                     48:        wkl = xcalloc(1, sizeof(*wkl));
                     49:
                     50:        len = strlcpy(wkl->wkl_path, path, sizeof(wkl->wkl_path));
                     51:        if (len >= sizeof(wkl->wkl_path))
1.3       ray        52:                errx(1, "path truncation in worklist_add");
1.1       joris      53:
                     54:        sigfillset(&new);
                     55:        sigprocmask(SIG_BLOCK, &new, &old);
                     56:        SLIST_INSERT_HEAD(worklist, wkl, wkl_list);
                     57:        sigprocmask(SIG_SETMASK, &old, NULL);
                     58: }
                     59:
                     60: /*
                     61:  * run over the given worklist, calling cb for each element.
1.3       ray        62:  * this is just like worklist_clean(), except we block signals first.
1.1       joris      63:  */
                     64: void
1.3       ray        65: worklist_run(struct wklhead *list, void (*cb)(struct worklist *))
1.1       joris      66: {
                     67:        sigset_t old, new;
1.3       ray        68:        struct worklist *wkl;
1.1       joris      69:
                     70:        sigfillset(&new);
                     71:        sigprocmask(SIG_BLOCK, &new, &old);
                     72:
1.3       ray        73:        worklist_clean(list, cb);
1.1       joris      74:
                     75:        while ((wkl = SLIST_FIRST(list)) != NULL) {
                     76:                SLIST_REMOVE_HEAD(list, wkl_list);
1.4     ! nicm       77:                free(wkl);
1.1       joris      78:        }
                     79:
                     80:        sigprocmask(SIG_SETMASK, &old, NULL);
                     81: }
                     82:
                     83: /*
                     84:  * pass elements to the specified callback, which has to be signal safe.
                     85:  */
                     86: void
1.3       ray        87: worklist_clean(struct wklhead *list, void (*cb)(struct worklist *))
1.1       joris      88: {
1.3       ray        89:        struct worklist *wkl;
1.1       joris      90:
                     91:        SLIST_FOREACH(wkl, list, wkl_list)
                     92:            cb(wkl);
                     93: }
                     94:
                     95: void
1.3       ray        96: worklist_unlink(struct worklist *wkl)
1.1       joris      97: {
                     98:        (void)unlink(wkl->wkl_path);
                     99: }