char sock_name[MAX_LEN];
+static int usr1Handler_hit=0;
static void
usr1Handler(int sig){
- TRACE("unmounting filesystem...");
- TRACE("socket name: %s", sock_name);
- unlink(sock_name);
-
- exit(0);
+ TRACE("usr1Handler...");
+ usr1Handler_hit=1;
}
static void
TRACE("thread created");
- free(p);
-
if(fs) {
handle_fs(fs, sock, ppid);
-
- if(fs->fs_ops->umount)
- fs->fs_ops->umount(fs->fs_context);
- fs->fs_ops->free(fs->fs_context);
-
- free(fs);
}else{
WARN("could not instantiate filesystem (out of mem?) !");
}
+ if(fs->fs_ops->umount){
+ TRACE("unmounting filesystem...");
+ fs->fs_ops->umount(fs->fs_context);
+ }
+ TRACE("freeing filesystem...");
+ fs->fs_ops->free(fs->fs_context);
+
+ free(fs);
+
close(sock);
TRACE("thread exiting...");
void
lu_fsctl_run(struct fs_ctl *ctl, int ssock, char *sn){
- pthread_t th_id;
socklen_t len;
struct sockaddr_un addr;
int sock;
- struct thread_info *info;
+ struct thread_info *info, *info_list=NULL;
+ struct sigaction sigaction_struct;
if(strlen(sn) >= MAX_LEN){
WARN("socket name too long!");
strcpy(sock_name, sn);
+#if 0 /* signal(2) will not abort accept(2) below. */
signal(SIGUSR1, usr1Handler);
+#else
+ memset(&sigaction_struct, 0, sizeof(sigaction_struct));
+ sigaction_struct.sa_handler = usr1Handler;
+ sigaction_struct.sa_flags = 0; /* !SA_RESTART */
+ sigaction(SIGUSR1, &sigaction_struct, NULL);
+#endif
signal(SIGPIPE, sig_handler);
signal(SIGTERM, sig_handler);
signal(SIGINT, sig_handler);
- while(1){
+ while(!usr1Handler_hit){
len = sizeof(struct sockaddr_un);
if((sock = accept(ssock, (struct sockaddr*)&addr, &len)) < 0){
info->sock = sock;
info->ppid = getpid();
- if(!pthread_create(&th_id, NULL, &thread_launcher, (void*)info)){
- pthread_detach(th_id);
+ if(!pthread_create(&info->th_id, NULL, &thread_launcher, (void*)info)){
+ info->next = info_list;
+ info_list= info;
}else{
WARN("could not create thread!");
free(info);
}
}
+ TRACE("joining threads...");
+ while ((info = info_list)){
+ info_list = info->next;
+ if (pthread_join(info->th_id, NULL))
+ WARN("could not join thread!");
+ free(info);
+ }
+ if (ctl->fs_available){
+ struct file_system *fs = ctl->fs_available;
+
+ if(fs->fs_ops->umount){
+ TRACE("unmounting filesystem...");
+ fs->fs_ops->umount(fs->fs_context);
+ }
+ TRACE("freeing filesystem...");
+ fs->fs_ops->free(fs->fs_context);
+
+ free(fs);
+ }
+ TRACE("socket name: %s", sock_name);
+ unlink(sock_name);
}
struct fs_ctl*