summaryrefslogtreecommitdiffstats
path: root/common/dotlock.h
blob: 0f52d40379f0d7884bed9ffd4a3dbf9ca5489aad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* dotlock.h - dotfile locking declarations
 * Copyright (C) 2000, 2001, 2006, 2011 Free Software Foundation, Inc.
 *
 * This file is part of GnuPG.
 *
 * GnuPG is free software; you can redistribute and/or modify this
 * part of GnuPG under the terms of either
 *
 *   - the GNU Lesser General Public License as published by the Free
 *     Software Foundation; either version 3 of the License, or (at
 *     your option) any later version.
 *
 * or
 *
 *   - the GNU General Public License as published by the Free
 *     Software Foundation; either version 2 of the License, or (at
 *     your option) any later version.
 *
 * or both in parallel, as here.
 *
 * GnuPG is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copies of the GNU General Public License
 * and the GNU Lesser General Public License along with this program;
 * if not, see <https://www.gnu.org/licenses/>.
 *
 * ALTERNATIVELY, this file may be distributed under the terms of the
 * following license, in which case the provisions of this license are
 * required INSTEAD OF the GNU Lesser General License or the GNU
 * General Public License. If you wish to allow use of your version of
 * this file only under the terms of the GNU Lesser General License or
 * the GNU General Public License, and not to allow others to use your
 * version of this file under the terms of the following license,
 * indicate your decision by deleting this paragraph and the license
 * below.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, and the entire permission notice in its entirety,
 *    including the disclaimer of warranties.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote
 *    products derived from this software without specific prior
 *    written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef GNUPG_COMMON_DOTLOCK_H
#define GNUPG_COMMON_DOTLOCK_H

/* See dotlock.c for a description.  */

#ifdef DOTLOCK_EXT_SYM_PREFIX
# ifndef _DOTLOCK_PREFIX
#  define _DOTLOCK_PREFIX1(x,y)  x ## y
#  define _DOTLOCK_PREFIX2(x,y) _DOTLOCK_PREFIX1(x,y)
#  define _DOTLOCK_PREFIX(x)    _DOTLOCK_PREFIX2(DOTLOCK_EXT_SYM_PREFIX,x)
# endif /*_DOTLOCK_PREFIX*/
# define dotlock_disable          _DOTLOCK_PREFIX(dotlock_disable)
# define dotlock_create           _DOTLOCK_PREFIX(dotlock_create)
# define dotlock_set_fd           _DOTLOCK_PREFIX(dotlock_set_fd)
# define dotlock_get_fd           _DOTLOCK_PREFIX(dotlock_get_fd)
# define dotlock_destroy          _DOTLOCK_PREFIX(dotlock_destroy)
# define dotlock_take             _DOTLOCK_PREFIX(dotlock_take)
# define dotlock_release          _DOTLOCK_PREFIX(dotlock_release)
# define dotlock_remove_lockfiles _DOTLOCK_PREFIX(dotlock_remove_lockfiles)
#endif /*DOTLOCK_EXT_SYM_PREFIX*/

#ifdef __cplusplus
extern "C"
{
#if 0
}
#endif
#endif


struct dotlock_handle;
typedef struct dotlock_handle *dotlock_t;

enum dotlock_reasons
  {
    DOTLOCK_CONFIG_TEST,   /* Can't check system - function terminates.  */
    DOTLOCK_FILE_ERROR,    /* General file error - function terminates.  */
    DOTLOCK_INV_FILE,      /* Invalid file       - function terminates.  */
    DOTLOCK_CONFLICT,      /* Something is wrong - function terminates.  */
    DOTLOCK_NOT_LOCKED,    /* Not locked - No action required.           */
    DOTLOCK_STALE_REMOVED, /* Stale lock file was removed - retrying.    */
    DOTLOCK_WAITING        /* Waiting for the lock - may be terminated.  */
  };

/* Flags for dotlock_create.  */
#define DOTLOCK_PREPARE_CREATE (1U << 5) /* Require dotlock_finish_create.  */
#define DOTLOCK_LOCK_BY_PARENT (1U << 6) /* Used by dotlock util.  */
#define DOTLOCK_LOCKED         (1U << 7) /* Used by dotlock util.  */

void dotlock_disable (void);
dotlock_t dotlock_create (const char *file_to_lock, unsigned int flags);
dotlock_t dotlock_finish_create (dotlock_t h, const char *file_to_lock);
void dotlock_set_fd (dotlock_t h, int fd);
int  dotlock_get_fd (dotlock_t h);
void dotlock_set_info_cb (dotlock_t h,
                          int (*cb)(dotlock_t, void *,
                                    enum dotlock_reasons reason,
                                    const char *,...),
                          void *opaque);
void dotlock_destroy (dotlock_t h);
int dotlock_take (dotlock_t h, long timeout);
int dotlock_is_locked (dotlock_t h);
int dotlock_release (dotlock_t h);
void dotlock_remove_lockfiles (void);

#ifdef __cplusplus
}
#endif
#endif /*GNUPG_COMMON_DOTLOCK_H*/