diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-01-01 13:25:55 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2013-01-01 13:33:04 +0200 |
commit | 24e6dfa7cffceea0cac0f3cc349192788f040939 (patch) | |
tree | c2bd53e9bc58873c8187e6bd622ae152b35d1d51 /src/gpg.c | |
parent | 2bdd70d698c63d32f25b4f1142e09f5eaef4812a (diff) | |
download | wydawca-24e6dfa7cffceea0cac0f3cc349192788f040939.tar.gz wydawca-24e6dfa7cffceea0cac0f3cc349192788f040939.tar.bz2 |
Update copyright years. Switch to a familiar style.
Diffstat (limited to 'src/gpg.c')
-rw-r--r-- | src/gpg.c | 527 |
1 files changed, 255 insertions, 272 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* wydawca - automatic release submission daemon | 1 | /* wydawca - automatic release submission daemon |
2 | Copyright (C) 2007, 2010-2011 Sergey Poznyakoff | 2 | Copyright (C) 2007, 2010-2013 Sergey Poznyakoff |
3 | 3 | ||
4 | Wydawca is free software; you can redistribute it and/or modify it | 4 | Wydawca is free software; you can redistribute it and/or modify it |
5 | under the terms of the GNU General Public License as published by the | 5 | under the terms of the GNU General Public License as published by the |
@@ -19,322 +19,305 @@ | |||
19 | #include "wydawca.h" | 19 | #include "wydawca.h" |
20 | #include <gpgme.h> | 20 | #include <gpgme.h> |
21 | 21 | ||
22 | #define fail_if_err(expr) \ | 22 | #define fail_if_err(expr) do { \ |
23 | do \ | 23 | int a = expr; \ |
24 | { \ | 24 | if (a) { \ |
25 | int a = expr; \ | 25 | logmsg(LOG_ERR, _("%s: GPGME error: %s"), #expr, \ |
26 | if (a) \ | 26 | gpgme_strerror(a)); \ |
27 | { \ | 27 | return 1; \ |
28 | logmsg (LOG_ERR, _("%s: GPGME error: %s"), #expr, \ | 28 | } \ |
29 | gpgme_strerror (a)); \ | 29 | } while (0) |
30 | return 1; \ | ||
31 | } \ | ||
32 | } \ | ||
33 | while (0) | ||
34 | 30 | ||
35 | char *temp_homedir; | 31 | char *temp_homedir; |
36 | 32 | ||
37 | static int rmdir_r (const char *name); | 33 | static int rmdir_r(const char *name); |
38 | 34 | ||
39 | /* Auxiliary function: change to directory NAME and recursively remove | 35 | /* Auxiliary function: change to directory NAME and recursively remove |
40 | everything under it. */ | 36 | everything under it. */ |
41 | static int | 37 | static int |
42 | recursive_rmdir (const char *name) | 38 | recursive_rmdir(const char *name) |
43 | { | 39 | { |
44 | int rc; | 40 | int rc; |
45 | DIR *dir; | 41 | DIR *dir; |
46 | struct dirent *ent; | 42 | struct dirent *ent; |
47 | 43 | ||
48 | if (chdir (name)) | 44 | if (chdir(name)) { |
49 | { | 45 | logmsg(LOG_ERR, _("cannot change to directory %s: %s"), |
50 | logmsg (LOG_ERR, _("cannot change to directory %s: %s"), | 46 | name, strerror(errno)); |
51 | name, strerror (errno)); | 47 | return 1; |
52 | return 1; | ||
53 | } | ||
54 | |||
55 | dir = opendir ("."); | ||
56 | if (!dir) | ||
57 | { | ||
58 | logmsg (LOG_ERR, _("cannot open directory %s: %s"), | ||
59 | name, strerror (errno)); | ||
60 | return 1; | ||
61 | } | ||
62 | |||
63 | for (rc = 0; rc == 0 && (ent = readdir (dir));) | ||
64 | { | ||
65 | struct stat st; | ||
66 | |||
67 | if (strcmp (ent->d_name, ".") == 0 | ||
68 | || strcmp (ent->d_name, "..") == 0) | ||
69 | continue; | ||
70 | |||
71 | if (stat (ent->d_name, &st) && errno != ENOENT) | ||
72 | { | ||
73 | logmsg (LOG_ERR, _("cannot stat file `%s': %s"), | ||
74 | name, strerror (errno)); | ||
75 | rc = 1; | ||
76 | } | 48 | } |
77 | else if (S_ISDIR (st.st_mode)) | 49 | |
78 | rc = rmdir_r (ent->d_name); | 50 | dir = opendir("."); |
79 | else if ((rc = unlink (ent->d_name)) != 0 && errno != ENOENT) | 51 | if (!dir) { |
80 | logmsg (LOG_ERR, _("cannot unlink %s: %s"), | 52 | logmsg(LOG_ERR, _("cannot open directory %s: %s"), |
81 | ent->d_name, strerror (errno)); | 53 | name, strerror(errno)); |
82 | } | 54 | return 1; |
83 | closedir (dir); | 55 | } |
84 | return rc; | 56 | |
57 | for (rc = 0; rc == 0 && (ent = readdir(dir));) { | ||
58 | struct stat st; | ||
59 | |||
60 | if (strcmp(ent->d_name, ".") == 0 | ||
61 | || strcmp(ent->d_name, "..") == 0) | ||
62 | continue; | ||
63 | |||
64 | if (stat(ent->d_name, &st) && errno != ENOENT) { | ||
65 | logmsg(LOG_ERR, _("cannot stat file `%s': %s"), | ||
66 | name, strerror(errno)); | ||
67 | rc = 1; | ||
68 | } else if (S_ISDIR(st.st_mode)) | ||
69 | rc = rmdir_r(ent->d_name); | ||
70 | else if ((rc = unlink(ent->d_name)) != 0 && errno != ENOENT) | ||
71 | logmsg(LOG_ERR, _("cannot unlink %s: %s"), | ||
72 | ent->d_name, strerror(errno)); | ||
73 | } | ||
74 | closedir(dir); | ||
75 | return rc; | ||
85 | } | 76 | } |
86 | 77 | ||
87 | /* Recursively remove the contents of the directory NAME and the directory | 78 | /* Recursively remove the contents of the directory NAME and the directory |
88 | itself. Do not change CWD. */ | 79 | itself. Do not change CWD. */ |
89 | static int | 80 | static int |
90 | rmdir_r (const char *name) | 81 | rmdir_r(const char *name) |
91 | { | 82 | { |
92 | int rc; | 83 | int rc; |
93 | 84 | ||
94 | if (push_dir (NULL)) | 85 | if (push_dir(NULL)) { |
95 | { | 86 | logmsg(LOG_ERR, _("cannot save current directory: %s"), |
96 | logmsg (LOG_ERR, _("cannot save current directory: %s"), | 87 | strerror(errno)); |
97 | strerror (errno)); | 88 | return 1; |
98 | return 1; | 89 | } |
99 | } | 90 | rc = recursive_rmdir(name); |
100 | rc = recursive_rmdir (name); | 91 | if (pop_dir()) { |
101 | if (pop_dir ()) | 92 | logmsg(LOG_ERR, _("cannot restore current directory: %s"), |
102 | { | 93 | strerror(errno)); |
103 | logmsg (LOG_ERR, _("cannot restore current directory: %s"), | 94 | rc = 1; |
104 | strerror (errno)); | 95 | } |
105 | rc = 1; | 96 | |
106 | } | 97 | if (rc == 0 && rmdir(name)) { |
107 | 98 | logmsg(LOG_ERR, _("cannot remove directory %s: %s"), | |
108 | if (rc == 0 && rmdir (name)) | 99 | name, strerror(errno)); |
109 | { | 100 | return 1; |
110 | logmsg (LOG_ERR, _("cannot remove directory %s: %s"), | 101 | } |
111 | name, strerror (errno)); | 102 | |
112 | return 1; | 103 | return rc; |
113 | } | ||
114 | |||
115 | return rc; | ||
116 | } | 104 | } |
117 | 105 | ||
118 | /* Remove temporary GPG home directory */ | 106 | /* Remove temporary GPG home directory */ |
119 | static void | 107 | static void |
120 | remove_homedir () | 108 | remove_homedir() |
121 | { | 109 | { |
122 | if (debug_level > 1) | 110 | if (debug_level > 1) |
123 | logmsg (LOG_DEBUG, _("removing GNUPG home directory: %s"), temp_homedir); | 111 | logmsg(LOG_DEBUG, _("removing GNUPG home directory: %s"), |
124 | if (rmdir_r (temp_homedir)) | 112 | temp_homedir); |
125 | logmsg (LOG_CRIT, _("failed to remove GPG directory %s"), temp_homedir); | 113 | if (rmdir_r(temp_homedir)) |
114 | logmsg(LOG_CRIT, _("failed to remove GPG directory %s"), | ||
115 | temp_homedir); | ||
126 | } | 116 | } |
127 | 117 | ||
128 | /* Create a temporary GPG home directory */ | 118 | /* Create a temporary GPG home directory */ |
129 | static int | 119 | static int |
130 | create_gpg_homedir () | 120 | create_gpg_homedir() |
131 | { | 121 | { |
132 | if (temp_homedir) | 122 | if (temp_homedir) |
133 | return 0; | 123 | return 0; |
134 | 124 | ||
135 | temp_homedir = grecs_strdup ("/tmp/wydawca-XXXXXX"); | 125 | temp_homedir = grecs_strdup("/tmp/wydawca-XXXXXX"); |
136 | if (!mkdtemp (temp_homedir)) | 126 | if (!mkdtemp(temp_homedir)) { |
137 | { | 127 | logmsg(LOG_CRIT, |
138 | logmsg (LOG_CRIT, _("cannot create GPG home directory (%s): %s"), | 128 | _("cannot create GPG home directory (%s): %s"), |
139 | temp_homedir, strerror (errno)); | 129 | temp_homedir, strerror(errno)); |
140 | return 1; | 130 | return 1; |
141 | } | 131 | } |
142 | atexit (remove_homedir); | 132 | atexit(remove_homedir); |
143 | if (debug_level > 1) | 133 | if (debug_level > 1) |
144 | logmsg (LOG_DEBUG, _("GNUPG home directory: %s"), temp_homedir); | 134 | logmsg(LOG_DEBUG, _("GNUPG home directory: %s"), temp_homedir); |
145 | setenv ("GNUPGHOME", temp_homedir, 1); | 135 | setenv("GNUPGHOME", temp_homedir, 1); |
146 | return 0; | 136 | return 0; |
147 | } | 137 | } |
148 | 138 | ||
149 | static int | 139 | static int |
150 | checksig (gpgme_signature_t sig, const char *uid, struct file_triplet *trp) | 140 | checksig(gpgme_signature_t sig, const char *uid, struct file_triplet *trp) |
151 | { | 141 | { |
152 | switch (gpg_err_code (sig->status)) | 142 | switch (gpg_err_code(sig->status)) { |
153 | { | 143 | case GPG_ERR_NO_ERROR: |
154 | case GPG_ERR_NO_ERROR: | 144 | if (debug_level) |
155 | if (debug_level) | 145 | logmsg(LOG_NOTICE, _("Good signature from %s"), uid); |
156 | logmsg (LOG_NOTICE, _("Good signature from %s"), uid); | 146 | trp->uploader = uploader_find_frp(trp->uploader_list, |
157 | trp->uploader = uploader_find_frp (trp->uploader_list, sig->fpr); | 147 | sig->fpr); |
158 | if (!trp->uploader) | 148 | if (!trp->uploader) { |
159 | { | 149 | logmsg(LOG_ERR, |
160 | logmsg (LOG_ERR, | 150 | _("good signature from %s, " |
161 | _("good signature from %s, " | 151 | "but the uploader info for %s not found"), |
162 | "but the uploader info for %s not found"), | 152 | uid, sig->fpr); |
163 | uid, sig->fpr); | 153 | return 1; |
164 | return 1; | 154 | } |