static void * process_command_thread(void * other) { struct fuse_client * c = other; int ret=0; char tosend[sizeof(struct afp_server_response) + MAX_CLIENT_RESPONSE]; struct afp_server_response response; switch(c->incoming_string[0]) { case AFP_SERVER_COMMAND_MOUNT: ret=process_mount(c); break; case AFP_SERVER_COMMAND_STATUS: ret=process_status(c); break; case AFP_SERVER_COMMAND_UNMOUNT: ret=process_unmount(c); break; case AFP_SERVER_COMMAND_SUSPEND: ret=process_suspend(c); break; case AFP_SERVER_COMMAND_RESUME: ret=process_resume(c); break; case AFP_SERVER_COMMAND_PING: ret=process_ping(c); break; case AFP_SERVER_COMMAND_EXIT: ret=process_exit(c); break; default: log_for_client((void *)c,AFPFSD,LOG_ERR,"Unknown command\n"); } /* Send response */ response.result=ret; response.len=strlen(c->client_string); bcopy(&response,tosend,sizeof(response)); bcopy(c->client_string,tosend+sizeof(response),response.len); ret=write(c->fd,tosend,sizeof(response)+response.len); if (ret<0) { perror("Writing"); } if ((!c) || (c->fd==0)) return NULL; rm_fd_and_signal(c->fd); close(c->fd); remove_client(c); return NULL; }
void loop_disconnect(struct afp_server *s) { if (s->connect_state!=SERVER_STATE_CONNECTED) return; rm_fd_and_signal(s->fd); /* Handle disconnect */ close(s->fd); s->connect_state=SERVER_STATE_DISCONNECTED; s->need_resume=1; }
static int process_command(struct fuse_client * c) { int ret; int fd; ret=read(c->fd,&c->incoming_string,AFP_CLIENT_INCOMING_BUF); if (ret<=0) { perror("reading"); goto out; } c->incoming_size=ret; pthread_t thread; pthread_create(&thread,NULL,process_command_thread,c); return 0; out: fd=c->fd; c->fd=0; remove_client(c); close(fd); rm_fd_and_signal(fd); return 0; }