]> arthur.barton.de Git - netatalk.git/blob - etc/afpd/switch.c
First working IPC reconnect
[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 #include <atalk/globals.h>
35
36 /* grab the FP functions */
37 #include "auth.h" 
38 #include "desktop.h"
39 #include "switch.h"
40 #include "fork.h"
41 #include "file.h"
42 #include "directory.h"
43 #include "filedir.h"
44 #include "status.h"
45 #include "misc.h"
46 #ifdef HAVE_ACLS
47 #include "acls.h"
48 #endif
49
50 static int afp_null(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf _U_,  size_t *rbuflen)
51 {
52     LOG(log_info, logtype_afpd, "afp_null handle %d", *ibuf );
53     *rbuflen = 0;
54     return( AFPERR_NOOP );
55 }
56
57 /*
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...
61  */
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 */
127 };
128
129 AFPCmd *afp_switch = preauth_switch;
130
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,
140     /*  24 -  31 */
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 */
197 };
198
199
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)
204 {
205     switch (which) {
206     case UAM_AFPSERVER_PREAUTH:
207         if (old)
208             *old = preauth_switch[id];
209         if (new_table)
210             preauth_switch[id] = new_table;
211         break;
212     case UAM_AFPSERVER_POSTAUTH:
213         if (old)
214             *old = postauth_switch[id];
215         if (new_table)
216             postauth_switch[id] = new_table;
217         break;
218     default:
219         LOG(log_debug, logtype_afpd, "uam_afpserver_action: unknown switch %d[%d]",
220             which, id);
221         return -1;
222     }
223
224     return 0;
225 }