-
- /* the master loaded the volumes for zeroconf, get rid of that */
- unload_volumes_and_extmap();
-}
-
-#ifdef USE_SRVLOC
-static void SRVLOC_callback(SLPHandle hslp _U_, SLPError errcode, void *cookie) {
- *(SLPError*)cookie = errcode;
-}
-
-static char hex[17] = "0123456789abcdef";
-
-static char * srvloc_encode(const struct afp_options *options, const char *name)
-{
- static char buf[512];
- char *conv_name;
- unsigned char *p;
- unsigned int i = 0;
-
- /* Convert name to maccharset */
- if ((size_t)-1 ==(convert_string_allocate( options->unixcharset, options->maccharset,
- name, -1, &conv_name)) )
- return (char*)name;
-
- /* Escape characters */
- p = conv_name;
- while (*p && i<(sizeof(buf)-4)) {
- if (*p == '@')
- break;
- else if (isspace(*p)) {
- buf[i++] = '%';
- buf[i++] = '2';
- buf[i++] = '0';
- p++;
- }
- else if ((!isascii(*p)) || *p <= 0x2f || *p == 0x3f ) {
- buf[i++] = '%';
- buf[i++] = hex[*p >> 4];
- buf[i++] = hex[*p++ & 15];
- }
- else {
- buf[i++] = *p++;
- }
- }
- buf[i] = '\0';
-
- free (conv_name);
-
- return buf;
-}
-#endif /* USE_SRVLOC */
-
-static void dsi_cleanup(const AFPConfig *config)
-{
-#ifdef USE_SRVLOC
- SLPError err;
- SLPError callbackerr;
- SLPHandle hslp;
- DSI *dsi = (DSI *)config->obj.handle;
-
- /* Do nothing if we didn't register. */
- if (!dsi || dsi->srvloc_url[0] == '\0')
- return;
-
- err = SLPOpen("en", SLP_FALSE, &hslp);
- if (err != SLP_OK) {
- LOG(log_error, logtype_afpd, "dsi_cleanup: Error opening SRVLOC handle");
- goto srvloc_dereg_err;
- }
-
- err = SLPDereg(hslp,
- dsi->srvloc_url,
- SRVLOC_callback,
- &callbackerr);
- if (err != SLP_OK) {
- LOG(log_error, logtype_afpd, "dsi_cleanup: Error unregistering %s from SRVLOC", dsi->srvloc_url);
- goto srvloc_dereg_err;
- }
-
- if (callbackerr != SLP_OK) {
- LOG(log_error, logtype_afpd, "dsi_cleanup: Error in callback while trying to unregister %s from SRVLOC (%d)", dsi->srvloc_url, callbackerr);
- goto srvloc_dereg_err;
- }
-
-srvloc_dereg_err:
- dsi->srvloc_url[0] = '\0';
- SLPClose(hslp);
-#endif /* USE_SRVLOC */
-}
-
-static afp_child_t *dsi_start(AFPConfig *config, AFPConfig *configs,
- server_child *server_children)
-{
- DSI *dsi = config->obj.handle;
- afp_child_t *child = NULL;
-
- if (!(child = dsi_getsession(dsi,
- server_children,
- config->obj.options.tickleval))) {
- LOG(log_error, logtype_afpd, "dsi_start: session error: %s", strerror(errno));
- return NULL;
- }
-
- /* we've forked. */
- if (parent_or_child == 1) {
- configfree(configs, config);
- config->obj.ipc_fd = child->ipc_fds[1];
- close(child->ipc_fds[0]); /* Close parent IPC fd */
- free(child);
- afp_over_dsi(&config->obj); /* start a session */
- exit (0);