2 * Copyright (c) 1990,1991 Regents of The University of Michigan.
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.
15 * Research Systems Unix Group
16 * The University of Michigan
18 * 535 W. William Street
21 * netatalk@itd.umich.edu
26 #endif /* HAVE_CONFIG_H */
28 #include <stdio.h> /* to pick up NULL */
29 #include <sys/stat.h> /* works around a bug */
30 #include <atalk/logger.h>
32 #include <atalk/afp.h>
33 #include <atalk/uam.h>
34 #include <atalk/globals.h>
36 /* grab the FP functions */
42 #include "directory.h"
50 static int afp_null(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_, size_t *rbuflen)
52 LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
54 return( AFPERR_NOOP );
58 * Routines marked "NULL" are not AFP functions.
59 * Routines marked "afp_null" are AFP functions
60 * which are not yet implemented. A fine line...
62 static AFPCmd preauth_switch[] = {
63 NULL, NULL, NULL, NULL,
64 NULL, NULL, NULL, NULL, /* 0 - 7 */
65 NULL, NULL, NULL, NULL,
66 NULL, NULL, NULL, NULL, /* 8 - 15 */
67 NULL, NULL, afp_login, afp_logincont,
68 afp_logout, NULL, NULL, NULL, /* 16 - 23 */
69 NULL, NULL, NULL, NULL,
70 NULL, NULL, NULL, NULL, /* 24 - 31 */
71 NULL, NULL, NULL, NULL,
72 NULL, NULL, NULL, NULL, /* 32 - 39 */
73 NULL, NULL, NULL, NULL,
74 NULL, NULL, NULL, NULL, /* 40 - 47 */
75 NULL, NULL, NULL, NULL,
76 NULL, NULL, NULL, NULL, /* 48 - 55 */
77 NULL, NULL, NULL, NULL,
78 NULL, NULL, NULL, afp_login_ext, /* 56 - 63 */
79 NULL, NULL, NULL, NULL,
80 NULL, NULL, NULL, NULL, /* 64 - 71 */
81 NULL, NULL, NULL, NULL,
82 NULL, NULL, NULL, NULL, /* 72 - 79 */
83 NULL, NULL, NULL, NULL,
84 NULL, NULL, NULL, NULL, /* 80 - 87 */
85 NULL, NULL, NULL, NULL,
86 NULL, NULL, NULL, NULL, /* 88 - 95 */
87 NULL, NULL, NULL, NULL,
88 NULL, NULL, NULL, NULL, /* 96 - 103 */
89 NULL, NULL, NULL, NULL,
90 NULL, NULL, NULL, NULL, /* 104 - 111 */
91 NULL, NULL, NULL, NULL,
92 NULL, NULL, NULL, NULL, /* 112 - 119 */
93 NULL, NULL, NULL, NULL,
94 NULL, NULL, NULL, NULL, /* 120 - 127 */
95 NULL, NULL, NULL, NULL,
96 NULL, NULL, NULL, NULL, /* 128 - 135 */
97 NULL, NULL, NULL, NULL,
98 NULL, NULL, NULL, NULL, /* 136 - 143 */
99 NULL, NULL, NULL, NULL,
100 NULL, NULL, NULL, NULL, /* 144 - 151 */
101 NULL, NULL, NULL, NULL,
102 NULL, NULL, NULL, NULL, /* 152 - 159 */
103 NULL, NULL, NULL, NULL,
104 NULL, NULL, NULL, NULL, /* 160 - 167 */
105 NULL, NULL, NULL, NULL,
106 NULL, NULL, NULL, NULL, /* 168 - 175 */
107 NULL, NULL, NULL, NULL,
108 NULL, NULL, NULL, NULL, /* 176 - 183 */
109 NULL, NULL, NULL, NULL,
110 NULL, NULL, NULL, NULL, /* 184 - 191 */
111 NULL, NULL, NULL, NULL,
112 NULL, NULL, NULL, NULL, /* 192 - 199 */
113 NULL, NULL, NULL, NULL,
114 NULL, NULL, NULL, NULL, /* 200 - 207 */
115 NULL, NULL, NULL, NULL,
116 NULL, NULL, NULL, NULL, /* 208 - 215 */
117 NULL, NULL, NULL, NULL,
118 NULL, NULL, NULL, NULL, /* 216 - 223 */
119 NULL, NULL, NULL, NULL,
120 NULL, NULL, NULL, NULL, /* 224 - 231 */
121 NULL, NULL, NULL, NULL,
122 NULL, NULL, NULL, NULL, /* 232 - 239 */
123 NULL, NULL, NULL, NULL,
124 NULL, NULL, NULL, NULL, /* 240 - 247 */
125 NULL, NULL, NULL, NULL,
126 NULL, NULL, NULL, NULL, /* 248 - 255 */
129 AFPCmd *afp_switch = preauth_switch;
131 AFPCmd postauth_switch[] = {
132 NULL, afp_bytelock, afp_closevol, afp_closedir,
133 afp_closefork, afp_copyfile, afp_createdir, afp_createfile, /* 0 - 7 */
134 afp_delete, afp_enumerate, afp_flush, afp_flushfork,
135 afp_null, afp_null, afp_getforkparams, afp_getsrvrinfo, /* 8 - 15 */
136 afp_getsrvrparms, afp_getvolparams, afp_login, afp_logincont,
137 afp_logout, afp_mapid, afp_mapname, afp_moveandrename, /* 16 - 23 */
138 afp_openvol, afp_opendir, afp_openfork, afp_read,
139 afp_rename, afp_setdirparams, afp_setfilparams, afp_setforkparams,
141 afp_setvolparams, afp_write, afp_getfildirparams, afp_setfildirparams,
142 afp_changepw, afp_getuserinfo, afp_getsrvrmesg, afp_createid, /* 32 - 39 */
143 afp_deleteid, afp_resolveid, afp_exchangefiles, afp_catsearch,
144 afp_null, afp_null, afp_null, afp_null, /* 40 - 47 */
145 afp_opendt, afp_closedt, afp_null, afp_geticon,
146 afp_geticoninfo, afp_addappl, afp_rmvappl, afp_getappl, /* 48 - 55 */
147 afp_addcomment, afp_rmvcomment, afp_getcomment, NULL,
148 NULL, NULL, NULL, NULL, /* 56 - 63 */
149 NULL, NULL, NULL, NULL,
150 NULL, NULL, NULL, NULL, /* 64 - 71 */
151 NULL, NULL, NULL, NULL,
152 NULL, NULL, afp_syncdir, afp_syncfork, /* 72 - 79 */
153 NULL, NULL, NULL, NULL,
154 NULL, NULL, NULL, NULL, /* 80 - 87 */
155 NULL, NULL, NULL, NULL,
156 NULL, NULL, NULL, NULL, /* 88 - 95 */
157 NULL, NULL, NULL, NULL,
158 afp_getdiracl, afp_setdiracl, afp_afschangepw, NULL, /* 96 - 103 */
159 NULL, NULL, NULL, NULL,
160 NULL, NULL, NULL, NULL, /* 104 - 111 */
161 NULL, NULL, NULL, NULL,
162 NULL, NULL, NULL, NULL, /* 112 - 119 */
163 NULL, NULL, NULL, NULL,
164 NULL, NULL, NULL, NULL, /* 120 - 127 */
165 NULL, NULL, NULL, NULL,
166 NULL, NULL, NULL, NULL, /* 128 - 135 */
167 NULL, NULL, NULL, NULL,
168 NULL, NULL, NULL, NULL, /* 136 - 143 */
169 NULL, NULL, NULL, NULL,
170 NULL, NULL, NULL, NULL, /* 144 - 151 */
171 NULL, NULL, NULL, NULL,
172 NULL, NULL, NULL, NULL, /* 152 - 159 */
173 NULL, NULL, NULL, NULL,
174 NULL, NULL, NULL, NULL, /* 160 - 167 */
175 NULL, NULL, NULL, NULL,
176 NULL, NULL, NULL, NULL, /* 168 - 175 */
177 NULL, NULL, NULL, NULL,
178 NULL, NULL, NULL, NULL, /* 176 - 183 */
179 NULL, NULL, NULL, NULL,
180 NULL, NULL, NULL, NULL, /* 184 - 191 */
181 afp_addicon, NULL, NULL, NULL,
182 NULL, NULL, NULL, NULL, /* 192 - 199 */
183 NULL, NULL, NULL, NULL,
184 NULL, NULL, NULL, NULL, /* 200 - 207 */
185 NULL, NULL, NULL, NULL,
186 NULL, NULL, NULL, NULL, /* 208 - 215 */
187 NULL, NULL, NULL, NULL,
188 NULL, NULL, NULL, NULL, /* 216 - 223 */
189 NULL, NULL, NULL, NULL,
190 NULL, NULL, NULL, NULL, /* 224 - 231 */
191 NULL, NULL, NULL, NULL,
192 NULL, NULL, NULL, NULL, /* 232 - 239 */
193 NULL, NULL, NULL, NULL,
194 NULL, NULL, NULL, NULL, /* 240 - 247 */
195 NULL, NULL, NULL, NULL,
196 NULL, NULL, NULL, NULL, /* 248 - 255 */
200 /* add a new function if it's specified. return the old function in
201 * "old" if there's a pointer there. */
202 int uam_afpserver_action(const int id, const int which,
203 AFPCmd new_table, AFPCmd *old)
206 case UAM_AFPSERVER_PREAUTH:
208 *old = preauth_switch[id];
210 preauth_switch[id] = new_table;
212 case UAM_AFPSERVER_POSTAUTH:
214 *old = postauth_switch[id];
216 postauth_switch[id] = new_table;
219 LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",