#include <sys/stat.h>
#endif /* HAVE_SYS_STAT_H */
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <setjmp.h>
#include <time.h>
#include <atalk/server_ipc.h>
#include <atalk/fce_api.h>
#include <atalk/globals.h>
+#include <atalk/netatalk_conf.h>
#include "switch.h"
#include "auth.h"
#include "fork.h"
#include "dircache.h"
+#ifndef SOL_TCP
+#define SOL_TCP IPPROTO_TCP
+#endif
+
/*
* We generally pass this from afp_over_dsi to all afp_* funcs, so it should already be
* available everywhere. Unfortunately some funcs (eg acltoownermode) need acces to it
static sigjmp_buf recon_jmp;
static void afp_dsi_close(AFPObj *obj)
{
- DSI *dsi = obj->handle;
+ DSI *dsi = obj->dsi;
close(obj->ipc_fd);
obj->ipc_fd = -1;
}
}
- close_all_vol();
+ close_all_vol(obj);
if (obj->logout)
(*obj->logout)();
*/
static void afp_dsi_die(int sig)
{
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
if (dsi->flags & DSI_RECONINPROG) {
/* Primary reconnect succeeded, got SIGTERM from afpd parent */
exit(0);
}
- dsi_attention(AFPobj->handle, AFPATTN_SHUTDOWN);
+ dsi_attention(AFPobj->dsi, AFPATTN_SHUTDOWN);
afp_dsi_close(AFPobj);
if (sig) /* if no signal, assume dieing because logins are disabled &
don't log it (maintenance mode)*/
/* SIGQUIT handler */
static void ipc_reconnect_handler(int sig _U_)
{
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
if (reconnect_ipc(AFPobj) != 0) {
LOG(log_error, logtype_afpd, "ipc_reconnect_handler: failed IPC reconnect");
{
uint16_t dsiID;
int socket;
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
LOG(log_debug, logtype_afpd, "afp_dsi_transfer_session: got SIGURG, trying to receive session");
{
struct sigaction sv;
struct itimerval it;
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
dsi->flags |= DSI_DIE;
/* shutdown and don't reconnect. server going down in 5 minutes. */
setmessage("The server is going down for maintenance.");
- if (dsi_attention(AFPobj->handle, AFPATTN_SHUTDOWN | AFPATTN_NORECONNECT |
+ if (dsi_attention(AFPobj->dsi, AFPATTN_SHUTDOWN | AFPATTN_NORECONNECT |
AFPATTN_MESG | AFPATTN_TIME(5)) < 0) {
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
dsi->down_request = 1;
}
/* ---------------------- */
static void afp_dsi_getmesg (int sig _U_)
{
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
dsi->msg_request = 1;
- if (dsi_attention(AFPobj->handle, AFPATTN_MESG | AFPATTN_TIME(5)) < 0)
+ if (dsi_attention(AFPobj->dsi, AFPATTN_MESG | AFPATTN_TIME(5)) < 0)
dsi->msg_request = 2;
}
static void alarm_handler(int sig _U_)
{
int err;
- DSI *dsi = (DSI *)AFPobj->handle;
+ DSI *dsi = (DSI *)AFPobj->dsi;
/* we have to restart the timer because some libraries may use alarm() */
setitimer(ITIMER_REAL, &dsi->timer, NULL);
if ((err = pollvoltime(AFPobj)) == 0)
LOG(log_debug, logtype_afpd, "afp_alarm: sending DSI tickle");
- err = dsi_tickle(AFPobj->handle);
+ err = dsi_tickle(AFPobj->dsi);
if (err <= 0) {
if (geteuid() == 0) {
LOG(log_note, logtype_afpd, "afp_alarm: unauthenticated user, connection problem");
if (dsi->msg_request) {
if (dsi->msg_request == 2) {
/* didn't send it in signal handler */
- dsi_attention(AFPobj->handle, AFPATTN_MESG | AFPATTN_TIME(5));
+ dsi_attention(AFPobj->dsi, AFPATTN_MESG | AFPATTN_TIME(5));
}
dsi->msg_request = 0;
readmessage(AFPobj);
}
if (dsi->down_request) {
dsi->down_request = 0;
- dsi_attention(AFPobj->handle, AFPATTN_SHUTDOWN | AFPATTN_NORECONNECT |
+ dsi_attention(AFPobj->dsi, AFPATTN_SHUTDOWN | AFPATTN_NORECONNECT |
AFPATTN_MESG | AFPATTN_TIME(5));
}
}
*/
void afp_over_dsi(AFPObj *obj)
{
- DSI *dsi = (DSI *) obj->handle;
+ DSI *dsi = (DSI *) obj->dsi;
int rc_idx;
uint32_t err, cmd;
uint8_t function;
}
}
+ /* set TCP_NODELAY */
+ int flag = 1;
+ setsockopt(dsi->socket, SOL_TCP, TCP_NODELAY, &flag, sizeof(flag));
+
/* get stuck here until the end */
while (1) {
if (sigsetjmp(recon_jmp, 1) != 0)
if (reload_request) {
reload_request = 0;
- load_volumes(AFPobj);
+ load_volumes(AFPobj, closevol);
}
/* The first SIGINT enables debugging, the next restores the config */
if (debugging) {
if (obj->options.logconfig)
- setuplog(obj->options.logconfig);
+ setuplog(obj->options.logconfig, obj->options.logfile);
else
- setuplog("default log_note");
+ setuplog("default:note", NULL);
debugging = 0;
} else {
char logstr[50];
debugging = 1;
- sprintf(logstr, "default log_maxdebug /tmp/afpd.%u.XXXXXX", getpid());
- setuplog(logstr);
+ sprintf(logstr, "/tmp/afpd.%u.XXXXXX", getpid());
+ setuplog("default:maxdebug", logstr);
}
}