"Fossies" - the Fresh Open Source Software Archive 
Member "tin-2.6.2/src/nrctbl.c" (9 Dec 2022, 8104 Bytes) of package /linux/misc/tin-2.6.2.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "nrctbl.c" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
2.6.1_vs_2.6.2.
1 /*
2 * Project : tin - a Usenet reader
3 * Module : nrctbl.c
4 * Author : Sven Paulus <sven@tin.org>
5 * Created : 1996-10-06
6 * Updated : 2020-04-23
7 * Notes : This module does the NNTP server name lookup in
8 * ~/.tin/newsrctable and returns the real hostname
9 * and the name of the newsrc file for a given
10 * alias of the server.
11 *
12 * Copyright (c) 1996-2023 Sven Paulus <sven@tin.org>
13 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 *
19 * 1. Redistributions of source code must retain the above copyright notice,
20 * this list of conditions and the following disclaimer.
21 *
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
25 *
26 * 3. Neither the name of the copyright holder nor the names of its
27 * contributors may be used to endorse or promote products derived from
28 * this software without specific prior written permission.
29 *
30 * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
34 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
36 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
37 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
38 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
40 * POSSIBILITY OF SUCH DAMAGE.
41 */
42
43
44 #ifndef TIN_H
45 # include "tin.h"
46 #endif /* !TIN_H */
47 #ifndef TCURSES_H
48 # include "tcurses.h"
49 #endif /* !TCURSES_H */
50 #ifndef VERSION_H
51 # include "version.h"
52 #endif /* !VERSION_H */
53
54
55 /*
56 * local prototypes
57 */
58 static void write_newsrctable_file(void);
59
60
61 /*
62 * write_newsrctable_file()
63 * create newsrctable file in local rc directory
64 */
65 static void
66 write_newsrctable_file(
67 void)
68 {
69 FILE *fp;
70
71 if ((fp = fopen(local_newsrctable_file, "w")) == NULL)
72 return;
73
74 fprintf(fp, _(txt_nrctbl_info), PRODUCT, VERSION);
75 #ifdef HAVE_FCHMOD
76 fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
77 #else
78 # ifdef HAVE_CHMOD
79 chmod(local_newsrctable_file, (mode_t) (S_IRUSR|S_IWUSR));
80 # endif /* HAVE_CHMOD */
81 #endif /* HAVE_FCHMOD */
82 fclose(fp);
83 }
84
85
86 #ifdef NNTP_ABLE
87 /*
88 * get_nntpserver()
89 * returns the FQDN of NNTP server by looking up a given
90 * nickname or alias in the newsrctable
91 * ---> extend to allow nameserver-lookups, if search in table
92 * failed
93 */
94 void
95 get_nntpserver(
96 char *nntpserver_name,
97 size_t nntpserver_name_len,
98 char *nick_name)
99 {
100 FILE *fp;
101 char *line_entry;
102 char line[LEN];
103 char name_found[PATH_LEN];
104 int line_entry_counter;
105 t_bool found = FALSE;
106
107 if ((fp = fopen(local_newsrctable_file, "r")) != NULL) {
108 while ((fgets(line, sizeof(line), fp) != NULL) && !found) {
109 line_entry_counter = 0;
110
111 if (!strchr("# ;", line[0])) {
112 while ((line_entry = strtok(line_entry_counter ? NULL : line, " \t\n")) != NULL) {
113 line_entry_counter++;
114
115 if (line_entry_counter == 1)
116 STRCPY(name_found, line_entry);
117
118 if ((line_entry_counter > 2) && (!strcasecmp(line_entry, nick_name)))
119 found = TRUE;
120 }
121 }
122 }
123 fclose(fp);
124 strncpy(nntpserver_name, (found ? name_found : nick_name), nntpserver_name_len);
125 } else {
126 write_newsrctable_file();
127 strncpy(nntpserver_name, nick_name, nntpserver_name_len);
128 }
129 nntpserver_name[nntpserver_name_len - 1] = '\0';
130 }
131 #endif /* NNTP_ABLE */
132
133
134 /*
135 * get_newsrcname()
136 * get name of newsrc file with given name of nntp server
137 * returns TRUE if name was found, FALSE if the search failed
138 */
139 t_bool
140 get_newsrcname(
141 char *newsrc_name,
142 size_t newsrc_name_len,
143 const char *nntpserver_name) /* return value is always ignored */
144 {
145 FILE *fp;
146 char *line_entry;
147 char line[LEN];
148 char name_found[PATH_LEN];
149 int line_entry_counter;
150 int found = 0;
151 t_bool do_cpy = FALSE;
152
153 if ((fp = fopen(local_newsrctable_file, "r")) != NULL) {
154 while ((fgets(line, (int) sizeof(line), fp) != NULL) && (found != 1)) {
155 line_entry_counter = 0;
156
157 if (!strchr("# ;", line[0])) {
158 while ((line_entry = strtok(line_entry_counter ? NULL : line, " \t\n")) != NULL) {
159 line_entry_counter++;
160
161 if ((line_entry_counter == 1) && (!strcasecmp(line_entry, nntpserver_name))) {
162 found = 1;
163 do_cpy = TRUE;
164 }
165
166 if ((line_entry_counter == 1) && ((!strcasecmp(line_entry, "default")) || (!strcmp(line_entry, "*")))) {
167 found = 2;
168 do_cpy = TRUE;
169 }
170 if (do_cpy && (line_entry_counter == 2)) {
171 STRCPY(name_found, line_entry);
172 do_cpy = FALSE;
173 }
174 }
175 }
176 }
177 fclose(fp);
178 if (found) {
179 char dir[PATH_LEN];
180 char tmp_newsrc[PATH_LEN];
181 int error = 0;
182
183 if (!strfpath(name_found, tmp_newsrc, sizeof(tmp_newsrc), NULL, FALSE)) {
184 my_fprintf(stderr, _("couldn't expand %s\n"), name_found); /* TODO: -> lang.c */
185 error = 1;
186 } else {
187 if (tmp_newsrc[0] == '/') {
188 (void) strncpy(newsrc_name, tmp_newsrc, newsrc_name_len);
189 newsrc_name[newsrc_name_len - 1] = '\0';
190 } else
191 joinpath(newsrc_name, newsrc_name_len, homedir, tmp_newsrc);
192
193 STRCPY(dir, newsrc_name);
194 if ((line_entry = strrchr(dir, '/'))) { /* dirname(newsrc_name) */
195 while (line_entry > &dir[0] && *line_entry == '/')
196 *line_entry-- = '\0';
197 }
198
199 /*
200 * TODO: shall we create a missing dir?
201 * currently something like
202 * ~/.tin/${NNTPSERVER-localhost}/.newsrc
203 * in newsrctable usually ends with
204 * "No permissions to go into /home/urs/.tin/${NNTPSERVER}"
205 */
206 /* FIXME - write a global permission check routine */
207 if (access(dir, X_OK)) {
208 my_fprintf(stderr, _(txt_error_no_enter_permission), dir);
209 error = 1;
210 } else if (access(newsrc_name, F_OK)) {
211 my_fprintf(stderr, _(txt_error_no_such_file), newsrc_name);
212 error = 2;
213 } else if (access(dir, R_OK)) {
214 my_fprintf(stderr, _(txt_error_no_read_permission), dir);
215 error = 1;
216 } else if (access(newsrc_name, R_OK)) {
217 my_fprintf(stderr, _(txt_error_no_read_permission), newsrc_name);
218 error = 1;
219 } else if (access(dir, W_OK)) {
220 my_fprintf(stderr, _(txt_error_no_write_permission), dir);
221 error = 1;
222 } else if (access(newsrc_name, W_OK)) {
223 my_fprintf(stderr, _(txt_error_no_write_permission), newsrc_name);
224 error = 1;
225 }
226 }
227
228 if (error) {
229 char ch, default_ch = 'a';
230
231 do {
232 /* very ugly code, but curses is not initialized yet */
233 if (error >= 2) {
234 default_ch = 'c';
235 printf("%s%c\b", _(txt_nrctbl_create), default_ch);
236 } else
237 printf("%s%c\b", _(txt_nrctbl_default), default_ch);
238
239 if ((ch = (char) ReadCh()) == '\r' || ch == '\n')
240 ch = default_ch;
241 } while (ch != ESC && ch != 'a' && ch != 'c' && ch != 'd' && ch != 'q');
242 printf("%c\n", ch);
243
244 /* NOTE: these keys can not be remapped */
245 switch (ch) {
246 case 'c':
247 /* FIXME this doesn't check if we could create the file */
248 return TRUE;
249
250 case 'd':
251 joinpath(newsrc_name, newsrc_name_len, homedir, ".newsrc");
252 return TRUE;
253
254 case 'a':
255 /*
256 * FIXME this (e.g. the location of the alternative name)
257 * is not documented in the man page
258 */
259 snprintf(name_found, sizeof(name_found), ".newsrc-%s", nntpserver_name);
260 joinpath(newsrc_name, newsrc_name_len, homedir, name_found);
261 return TRUE;
262
263 case 'q':
264 exit(EXIT_SUCCESS);
265 /* keep lint quiet: */
266 /* FALLTHROUGH */
267
268 case ESC:
269 default:
270 return TRUE;
271 }
272 }
273 return TRUE;
274 }
275 } else
276 write_newsrctable_file();
277
278 return FALSE;
279 }