source: trunk/athena/bin/discuss/libds/interface.c @ 22404

Revision 22404, 8.6 KB checked in by ghudson, 18 years ago (diff)
Eliminate declarations of system functions which cause warnings or errors. Fix some broken ss library calls.
Line 
1/*
2 *
3 *      Copyright (C) 1988, 1989 by the Massachusetts Institute of Technology
4 *      Developed by the MIT Student Information Processing Board (SIPB).
5 *      For copying information, see the file mit-copyright.h in this release.
6 *
7 */
8/*
9 *      $Id: interface.c,v 1.31 2006-03-10 07:11:38 ghudson Exp $
10 *
11 */
12
13#ifndef lint
14static char rcsid_interface_c[] =
15    "$Id: interface.c,v 1.31 2006-03-10 07:11:38 ghudson Exp $";
16static char copyright[] =
17    "Copyright (C) 1989 by the Massachusetts Institute of Technology";
18#endif /* lint */
19
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <errno.h>
24#include <discuss/tfile.h>
25#include <discuss/interface.h>
26#include <discuss/acl.h>
27#include <discuss/dsname.h>
28#include "rpc.h"
29#include <discuss/dsc_et.h>
30
31/* for linked list of meetings */
32
33#define same_str(s1,s2)         ((s1==s2)||!strcmp(s1,s2))
34/* note -- first must be (name_blk *), second must be (meeting *) */
35#define same_mtg(nbp,mtg)\
36        (same_str(nbp->hostname,mtg->host)&&same_str(nbp->pathname,mtg->path))
37
38typedef struct _meeting {
39        struct _meeting *next;
40        struct _meeting *prev;
41        char *host, *path;
42        char *module;
43} meeting;
44
45static int (*warning_hook)() = 0;
46
47static meeting *meeting_list = (meeting *)NULL;
48meeting *cmtg = (meeting *) NULL;
49#define mtg_name (cmtg->path)
50
51#define FREE(ptr) { if (ptr) free(ptr); }
52
53static meeting *create_mblock(host, path, code_ptr)
54        char *host, *path;
55        int *code_ptr;
56{
57        register meeting *mp;
58        static int initialized = 0;
59       
60        *code_ptr = 0;
61
62        if (!initialized) {
63                init_rpc();
64                meeting_list = (meeting *)NULL;
65                initialized = 1;
66        }
67        if (!(mp = (meeting *)malloc(sizeof (meeting)))) {
68                *code_ptr = errno;
69                return NULL;
70        }
71
72        mp->path = NULL;        /* initialize, for later cleanup */
73        mp->host = NULL;       
74       
75        mp->module = malloc (strlen (host) + 9);
76        if (!mp->module) goto out;
77       
78        strcpy (mp->module , "discuss@");
79        strcpy (&(mp->module [8]), host);
80
81        mp->host = malloc(strlen(host)+1);
82        if (!mp->host) goto out;
83        strcpy(mp->host, host);
84
85        mp->path = malloc(strlen(path)+1);
86        if (!mp->path) goto out;
87        strcpy(mp->path, path);
88
89        /* link 'em up.. */
90        mp->next = meeting_list;
91        mp->prev = NULL;
92        if (meeting_list) meeting_list -> prev = mp;
93        meeting_list = mp;
94        return mp;
95       
96out:
97        *code_ptr = errno;
98        if (mp->host) free(mp->host);
99        if (mp->path) free(mp->path);
100        if (mp->module) free(mp->module);
101        free(mp);
102        return NULL;
103}
104
105static
106select_meeting(nbp, code_ptr)
107        name_blk *nbp;
108        int *code_ptr;
109{
110        register meeting *mp;
111        int fatal;
112
113        *code_ptr = 0;
114
115        /*
116         * Is the current meeting one which we've talked to recently?
117         */
118        for (mp = meeting_list; mp; mp = mp->next) {
119                if (same_mtg(nbp, mp))
120                        break;
121        }
122        if (!mp) {
123                mp = create_mblock(nbp->hostname, nbp->pathname, code_ptr);
124                if (*code_ptr)
125                        return;
126        } else {
127                /*XXX should move mp to head of list.. but not yet */
128        }
129        set_module (mp->module, &fatal, code_ptr);
130        if (*code_ptr && !fatal) {
131            char buf[100];
132            sprintf(buf, "while connecting to %s", mp->module);
133            log_warning (*code_ptr, buf);
134            *code_ptr = 0;
135        }
136        cmtg = mp;
137}
138
139dsc_add_trn(nbp, text, subject, reply_trn, result_trn, code_ptr)
140        name_blk *nbp;
141        tfile text;
142        char *subject;
143        trn_nums reply_trn, *result_trn;
144        int *code_ptr;
145{
146        select_meeting(nbp, code_ptr);
147        if (*code_ptr) return;
148        add_trn(mtg_name, text, subject, reply_trn, result_trn, code_ptr);
149}
150
151dsc_add_trn2(nbp, text, subject, signature, reply_trn, result_trn, code_ptr)
152        name_blk *nbp;
153        tfile text;
154        char *subject;
155        char *signature;
156        trn_nums reply_trn, *result_trn;
157        int *code_ptr;
158{
159        select_meeting(nbp, code_ptr);
160        if (*code_ptr) return;
161        if (get_conv_server_version() >= SERVER_2)
162             add_trn2(mtg_name, text, subject, signature, reply_trn, result_trn, code_ptr);
163        else {
164             add_trn(mtg_name, text, subject, reply_trn, result_trn, code_ptr);
165        }
166}
167
168dsc_get_trn_info(nbp, trn, info, code_ptr)
169        name_blk *nbp;
170        trn_nums trn;
171        trn_info *info;
172        int *code_ptr;
173{
174        select_meeting(nbp, code_ptr);
175        if (*code_ptr) return;
176        get_trn_info(mtg_name, trn, info, code_ptr);
177}
178
179dsc_get_trn_info2(nbp, trn, info, code_ptr)
180        name_blk *nbp;
181        trn_nums trn;
182        trn_info2 *info;
183        int *code_ptr;
184{
185        select_meeting(nbp, code_ptr);
186        if (*code_ptr) return;
187        if (get_conv_server_version() >= SERVER_1)
188             get_trn_info2(mtg_name, trn, info, code_ptr);
189        else {
190             get_trn_info(mtg_name, trn, (trn_info *) info, code_ptr);
191             info -> flags = 0;
192        }
193}
194
195dsc_get_trn_info3(nbp, trn, info, code_ptr)
196        name_blk *nbp;
197        trn_nums trn;
198        trn_info3 *info;
199        int *code_ptr;
200{
201        select_meeting(nbp, code_ptr);
202        if (*code_ptr) return;
203        if (get_conv_server_version() >= SERVER_2)
204             get_trn_info3(mtg_name, trn, info, code_ptr);
205        else if (get_conv_server_version() >= SERVER_1) {
206             get_trn_info2(mtg_name, trn, (trn_info2 *) info, code_ptr);
207             info -> signature = 0;
208        } else {
209             get_trn_info(mtg_name, trn, (trn_info *) info, code_ptr);
210             info -> signature = 0;
211             info -> flags = 0;
212        }
213}
214
215dsc_set_trn_flags(nbp, trn, flags, code_ptr)
216        name_blk *nbp;
217        trn_nums trn;
218        int flags;
219        int *code_ptr;
220{
221        select_meeting(nbp, code_ptr);
222        if (*code_ptr) return;
223        if (get_conv_server_version() >= SERVER_1)
224             set_trn_flags(mtg_name, trn, flags, code_ptr);
225        else {
226             *code_ptr = NO_SUPPORT;
227        }
228}
229
230dsc_delete_trn(nbp, trn, code_ptr)
231        name_blk *nbp;
232        trn_nums trn;
233        int *code_ptr;
234{
235        select_meeting(nbp, code_ptr);
236        if (*code_ptr) return;
237        delete_trn(mtg_name, trn, code_ptr);
238}
239
240dsc_retrieve_trn(nbp, trn, code_ptr)
241        name_blk *nbp;
242        trn_nums trn;
243        int *code_ptr;
244{
245        select_meeting(nbp, code_ptr);
246        if (*code_ptr) return;
247        retrieve_trn(mtg_name, trn, code_ptr);
248}
249
250dsc_create_mtg(host, location, name, public, hidden, code_ptr)
251        char *host, *location, *name;
252        bool public, hidden;
253        int *code_ptr;
254{
255        register meeting *mp;
256        int fatal;
257        mp = create_mblock(host, location, code_ptr);
258        if (*code_ptr) return;
259        set_module(mp->module, &fatal, code_ptr);
260        if (*code_ptr) return;
261       
262        create_mtg(location, name, public, code_ptr);
263        return;
264}
265
266dsc_get_mtg_info(nbp, info, code_ptr)
267        name_blk *nbp;
268        mtg_info *info;
269        int *code_ptr;
270{
271        select_meeting(nbp, code_ptr);
272        if (*code_ptr) return;
273        get_mtg_info(mtg_name, info, code_ptr);
274}
275
276
277dsc_get_trn(nbp, trn, dest, code_ptr)
278        name_blk *nbp;
279        trn_nums trn;
280        tfile dest;
281        int *code_ptr;
282{
283        select_meeting(nbp, code_ptr);
284        if (*code_ptr) return;
285        get_trn(mtg_name, trn, dest, code_ptr);
286}
287
288dsc_remove_mtg(nbp, code_ptr)
289        name_blk *nbp;
290        int *code_ptr;
291{
292        select_meeting(nbp, code_ptr);
293        if (*code_ptr) return;
294        remove_mtg(mtg_name, code_ptr);
295}
296
297dsc_updated_mtg (nbp, updated, result)
298        name_blk *nbp;
299        bool *updated;
300        int *result;
301{
302        select_meeting(nbp, result);
303        if (*result) return;
304        updated_mtg(mtg_name, nbp->date_attended, nbp->last, updated, result);
305}
306
307dsc_get_acl (nbp, result, list)
308        name_blk *nbp;
309        int *result;   
310        dsc_acl **list;
311{       
312        select_meeting(nbp, result);
313        if(*result) return;
314        get_acl(mtg_name, result, list);
315}
316
317dsc_get_access (nbp, princ, modes, result)
318        name_blk *nbp;
319        char *princ;
320        char **modes;
321        int *result;
322{
323        select_meeting(nbp, result);
324        if (*result) return;
325        get_access(mtg_name, princ, modes, result);
326}
327
328dsc_set_access (nbp, princ, modes, result)
329        name_blk *nbp;
330        char *princ;
331        char *modes;
332        int *result;
333{
334        select_meeting(nbp, result);
335        if (*result) return;
336        set_access(mtg_name, princ, modes, result);
337}
338
339dsc_delete_access (nbp, princ, result)
340        name_blk *nbp;
341        char *princ;
342        int *result;
343{
344        select_meeting(nbp, result);
345        if (*result) return;
346        delete_access(mtg_name, princ, result);
347}
348
349dsc_whoami(nbp, ident, result)
350        name_blk *nbp;
351        char **ident;
352        int *result;
353{
354        select_meeting(nbp, result);
355        if (*result) return;
356        dwhoami(ident, result);
357}
358
359void dsc_destroy_mtg_info (info)
360        register mtg_info *info;
361{
362        if (info->chairman) {
363                free(info->chairman);
364                info->chairman = NULL;
365        }
366        if (info->access_modes) {
367                free (info->access_modes);
368                info->access_modes = NULL;
369        }
370        if (info->location) {
371                free(info->location);
372                info->location = NULL;
373        }
374        if (info->long_name) {
375                free(info->long_name);
376                info->long_name = NULL;
377        }
378}
379
380void dsc_destroy_trn_info (info)
381        register trn_info *info;
382{
383        if (info->author) {
384                free (info->author);
385                info->author = NULL;
386        }
387        if (info->subject) {
388                free (info->subject);
389                info->subject = NULL;
390        }
391}
392
393void dsc_destroy_trn_info3 (info)
394        register trn_info3 *info;
395{
396        if (info->author) {
397                free (info->author);
398                info->author = NULL;
399        }
400        if (info->subject) {
401                free (info->subject);
402                info->subject = NULL;
403        }
404        if (info->signature) {
405                free (info->signature);
406                info->signature = NULL;
407        }
408}
409
410log_warning(code, buf)
411int code;
412char *buf;
413{
414     if (warning_hook == 0)
415          printf("Warning: %s %s\n", error_message(code), buf);
416     else
417          (*warning_hook)(code, buf);
418}
419
420set_warning_hook(hook)
421int (*hook)();
422{
423     warning_hook = hook;
424}
Note: See TracBrowser for help on using the repository browser.