]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/switch.c
7fa024252fa6b7daeebf325a7a4f81dd0d2b4b86
[netatalk.git] / etc / afpd / switch.c
1 /*
2  * $Id: switch.c,v 1.12.8.1 2005-09-27 10:40:41 didg Exp $
3  *
4  * Copyright (c) 1990,1991 Regents of The University of Michigan.
5  * All Rights Reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software and
8  * its documentation for any purpose and without fee is hereby granted,
9  * provided that the above copyright notice appears in all copies and
10  * that both that copyright notice and this permission notice appear
11  * in supporting documentation, and that the name of The University
12  * of Michigan not be used in advertising or publicity pertaining to
13  * distribution of the software without specific, written prior
14  * permission. This software is supplied as is without expressed or
15  * implied warranties of any kind.
16  *
17  *      Research Systems Unix Group
18  *      The University of Michigan
19  *      c/o Mike Clark
20  *      535 W. William Street
21  *      Ann Arbor, Michigan
22  *      +1-313-763-0525
23  *      netatalk@itd.umich.edu
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif /* HAVE_CONFIG_H */
29
30 #include <stdio.h>  /* to pick up NULL */
31 #include <sys/stat.h> /* works around a bug */
32 #include <atalk/logger.h>
33
34 #include <atalk/afp.h>
35 #include <atalk/uam.h>
36
37 #include "globals.h"
38
39 /* grab the FP functions */
40 #include "auth.h" 
41 #include "desktop.h"
42 #include "switch.h"
43 #include "fork.h"
44 #include "file.h"
45 #include "directory.h"
46 #include "filedir.h"
47 #include "status.h"
48 #include "misc.h"
49
50 static int afp_null(obj, ibuf, ibuflen, rbuf, rbuflen )
51 AFPObj  *obj _U_;
52 char    *ibuf, *rbuf _U_;
53 int     ibuflen _U_, *rbuflen;
54 {
55     LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
56     *rbuflen = 0;
57     return( AFPERR_NOOP );
58 }
59
60 /*
61  * Routines marked "NULL" are not AFP functions.
62  * Routines marked "afp_null" are AFP functions
63  * which are not yet implemented. A fine line...
64  */
65 int     (*preauth_switch[])() = {
66     NULL, NULL, NULL, NULL,
67     NULL, NULL, NULL, NULL,                                     /*   0 -   7 */
68     NULL, NULL, NULL, NULL,
69     NULL, NULL, NULL, NULL,                                     /*   8 -  15 */
70     NULL, NULL, afp_login, afp_logincont,
71     afp_logout, NULL, NULL, NULL,                               /*  16 -  23 */
72     NULL, NULL, NULL, NULL,
73     NULL, NULL, NULL, NULL,                                     /*  24 -  31 */
74     NULL, NULL, NULL, NULL,
75     NULL, NULL, NULL, NULL,                                     /*  32 -  39 */
76     NULL, NULL, NULL, NULL,
77     NULL, NULL, NULL, NULL,                                     /*  40 -  47 */
78     NULL, NULL, NULL, NULL,
79     NULL, NULL, NULL, NULL,                                     /*  48 -  55 */
80     NULL, NULL, NULL, NULL,
81     NULL, NULL, NULL, afp_login_ext,                            /*  56 -  63 */
82     NULL, NULL, NULL, NULL,
83     NULL, NULL, NULL, NULL,                                     /*  64 -  71 */
84     NULL, NULL, NULL, NULL,
85     NULL, NULL, NULL, NULL,                                     /*  72 -  79 */
86     NULL, NULL, NULL, NULL,
87     NULL, NULL, NULL, NULL,                                     /*  80 -  87 */
88     NULL, NULL, NULL, NULL,
89     NULL, NULL, NULL, NULL,                                     /*  88 -  95 */
90     NULL, NULL, NULL, NULL,
91     NULL, NULL, NULL, NULL,                                     /*  96 - 103 */
92     NULL, NULL, NULL, NULL,
93     NULL, NULL, NULL, NULL,                                     /* 104 - 111 */
94     NULL, NULL, NULL, NULL,
95     NULL, NULL, NULL, NULL,                                     /* 112 - 119 */
96     NULL, NULL, NULL, NULL,
97     NULL, NULL, NULL, NULL,                                     /* 120 - 127 */
98     NULL, NULL, NULL, NULL,
99     NULL, NULL, NULL, NULL,                                     /* 128 - 135 */
100     NULL, NULL, NULL, NULL,
101     NULL, NULL, NULL, NULL,                                     /* 136 - 143 */
102     NULL, NULL, NULL, NULL,
103     NULL, NULL, NULL, NULL,                                     /* 144 - 151 */
104     NULL, NULL, NULL, NULL,
105     NULL, NULL, NULL, NULL,                                     /* 152 - 159 */
106     NULL, NULL, NULL, NULL,
107     NULL, NULL, NULL, NULL,                                     /* 160 - 167 */
108     NULL, NULL, NULL, NULL,
109     NULL, NULL, NULL, NULL,                                     /* 168 - 175 */
110     NULL, NULL, NULL, NULL,
111     NULL, NULL, NULL, NULL,                                     /* 176 - 183 */
112     NULL, NULL, NULL, NULL,
113     NULL, NULL, NULL, NULL,                                     /* 184 - 191 */
114     NULL, NULL, NULL, NULL,
115     NULL, NULL, NULL, NULL,                                     /* 192 - 199 */
116     NULL, NULL, NULL, NULL,
117     NULL, NULL, NULL, NULL,                                     /* 200 - 207 */
118     NULL, NULL, NULL, NULL,
119     NULL, NULL, NULL, NULL,                                     /* 208 - 215 */
120     NULL, NULL, NULL, NULL,
121     NULL, NULL, NULL, NULL,                                     /* 216 - 223 */
122     NULL, NULL, NULL, NULL,
123     NULL, NULL, NULL, NULL,                                     /* 224 - 231 */
124     NULL, NULL, NULL, NULL,
125     NULL, NULL, NULL, NULL,                                     /* 232 - 239 */
126     NULL, NULL, NULL, NULL,
127     NULL, NULL, NULL, NULL,                                     /* 240 - 247 */
128     NULL, NULL, NULL, NULL,
129     NULL, NULL, NULL, NULL,                                     /* 248 - 255 */
130 };
131
132 int     (**afp_switch)() = preauth_switch;
133
134 int     (*postauth_switch[])() = {
135     NULL, afp_bytelock, afp_closevol, afp_closedir,
136     afp_closefork, afp_copyfile, afp_createdir, afp_createfile, /*   0 -   7 */
137     afp_delete, afp_enumerate, afp_flush, afp_flushfork,
138     afp_null, afp_null, afp_getforkparams, afp_getsrvrinfo,     /*   8 -  15 */
139     afp_getsrvrparms, afp_getvolparams, afp_login, afp_logincont,
140     afp_logout, afp_mapid, afp_mapname, afp_moveandrename,      /*  16 -  23 */
141     afp_openvol, afp_opendir, afp_openfork, afp_read,
142     afp_rename, afp_setdirparams, afp_setfilparams, afp_setforkparams,
143     /*  24 -  31 */
144     afp_setvolparams, afp_write, afp_getfildirparams, afp_setfildirparams,
145     afp_changepw, afp_getuserinfo, afp_getsrvrmesg, afp_createid, /*  32 -  39 */
146     afp_deleteid, afp_resolveid, afp_exchangefiles, afp_catsearch,
147     afp_null, afp_null, afp_null, afp_null,                     /*  40 -  47 */
148     afp_opendt, afp_closedt, afp_null, afp_geticon,
149     afp_geticoninfo, afp_addappl, afp_rmvappl, afp_getappl,     /*  48 -  55 */
150     afp_addcomment, afp_rmvcomment, afp_getcomment, NULL,
151     NULL, NULL, NULL, NULL,                                     /*  56 -  63 */
152     NULL, NULL, NULL, NULL,
153     NULL, NULL, NULL, NULL,                                     /*  64 -  71 */
154     NULL, NULL, NULL, NULL,
155     NULL, NULL, NULL, NULL,                                     /*  72 -  79 */
156     NULL, NULL, NULL, NULL,
157     NULL, NULL, NULL, NULL,                                     /*  80 -  87 */
158     NULL, NULL, NULL, NULL,
159     NULL, NULL, NULL, NULL,                                     /*  88 -  95 */
160     NULL, NULL, NULL, NULL,
161     afp_getdiracl, afp_setdiracl, afp_afschangepw, NULL,        /*  96 - 103 */
162     NULL, NULL, NULL, NULL,
163     NULL, NULL, NULL, NULL,                                     /* 104 - 111 */
164     NULL, NULL, NULL, NULL,
165     NULL, NULL, NULL, NULL,                                     /* 112 - 119 */
166     NULL, NULL, NULL, NULL,
167     NULL, NULL, NULL, NULL,                                     /* 120 - 127 */
168     NULL, NULL, NULL, NULL,
169     NULL, NULL, NULL, NULL,                                     /* 128 - 135 */
170     NULL, NULL, NULL, NULL,
171     NULL, NULL, NULL, NULL,                                     /* 136 - 143 */
172     NULL, NULL, NULL, NULL,
173     NULL, NULL, NULL, NULL,                                     /* 144 - 151 */
174     NULL, NULL, NULL, NULL,
175     NULL, NULL, NULL, NULL,                                     /* 152 - 159 */
176     NULL, NULL, NULL, NULL,
177     NULL, NULL, NULL, NULL,                                     /* 160 - 167 */
178     NULL, NULL, NULL, NULL,
179     NULL, NULL, NULL, NULL,                                     /* 168 - 175 */
180     NULL, NULL, NULL, NULL,
181     NULL, NULL, NULL, NULL,                                     /* 176 - 183 */
182     NULL, NULL, NULL, NULL,
183     NULL, NULL, NULL, NULL,                                     /* 184 - 191 */
184     afp_addicon, NULL, NULL, NULL,
185     NULL, NULL, NULL, NULL,                                     /* 192 - 199 */
186     NULL, NULL, NULL, NULL,
187     NULL, NULL, NULL, NULL,                                     /* 200 - 207 */
188     NULL, NULL, NULL, NULL,
189     NULL, NULL, NULL, NULL,                                     /* 208 - 215 */
190     NULL, NULL, NULL, NULL,
191     NULL, NULL, NULL, NULL,                                     /* 216 - 223 */
192     NULL, NULL, NULL, NULL,
193     NULL, NULL, NULL, NULL,                                     /* 224 - 231 */
194     NULL, NULL, NULL, NULL,
195     NULL, NULL, NULL, NULL,                                     /* 232 - 239 */
196     NULL, NULL, NULL, NULL,
197     NULL, NULL, NULL, NULL,                                     /* 240 - 247 */
198     NULL, NULL, NULL, NULL,
199     NULL, NULL, NULL, NULL,                                     /* 248 - 255 */
200 };
201
202
203 /* add a new function if it's specified. return the old function in
204  * "old" if there's a pointer there. */
205 int uam_afpserver_action(const int id, const int which,
206                          int (*new)(), int (**old)())
207 {
208     switch (which) {
209     case UAM_AFPSERVER_PREAUTH:
210         if (old)
211             *old = preauth_switch[id];
212         if (new)
213             preauth_switch[id] = new;
214         break;
215     case UAM_AFPSERVER_POSTAUTH:
216         if (old)
217             *old = postauth_switch[id];
218         if (new)
219             postauth_switch[id] = new;
220         break;
221     default:
222         LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",
223             which, id);
224         return -1;
225     }
226
227     return 0;
228 }