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