X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=command.c;h=3932ed2215691ea12fbbf04b7c7de9884c4cce4b;hp=b6c2de2788a131f446f48893717a826ea3fd8845;hb=faccd246cf9ee662cd8262d0db2a2375c1d4da86;hpb=35f1fc325ea80370bb00e7cfcafe457ab6aca27c diff --git a/command.c b/command.c index b6c2de27..3932ed22 100644 --- a/command.c +++ b/command.c @@ -26,6 +26,7 @@ #include "net.h" #include "daemon.h" #include "fd.h" +#include "ipc.h" #include "user_list.h" #include "server_command_list.h" #include "afs_command_list.h" @@ -37,6 +38,7 @@ static RC4_KEY rc4_recv_key; static RC4_KEY rc4_send_key; static unsigned char rc4_buf[2 * RC4_KEY_LEN]; +extern int mmd_mutex; extern struct misc_meta_data *mmd; extern struct sender senders[]; @@ -53,23 +55,26 @@ static void dummy(int s) static void mmd_dup(struct misc_meta_data *new_mmd) { - mmd_lock(); + mutex_lock(mmd_mutex); *new_mmd = *mmd; - mmd_unlock(); + mutex_unlock(mmd_mutex); } /* - * compute human readable string containing - * vss status for given integer value + * Compute human readable string containing vss status for given integer value. + * + * We don't want to use vss_playing() and friends here because we take a + * snapshot of the mmd struct and use the copy for computing the state of the + * vss. If the real data were used, we would take the mmd lock for a rather + * long time or risk to get an inconsistent view. */ static char *vss_status_tohuman(unsigned int flags) { if (flags & VSS_PLAYING) return para_strdup("playing"); - else if (flags & VSS_NEXT) + if (flags & VSS_NEXT) return para_strdup("stopped"); - else - return para_strdup("paused"); + return para_strdup("paused"); } /* @@ -175,12 +180,8 @@ static int check_sender_args(int argc, char * const * argv, struct sender_comman if (!subcmds[i]) return -E_COMMAND_SYNTAX; scd->cmd_num = i; - mmd_lock(); - if (!senders[scd->sender_num].client_cmds[scd->cmd_num]) { - mmd_unlock(); + if (!senders[scd->sender_num].client_cmds[scd->cmd_num]) return -E_SENDER_CMD; - } - mmd_unlock(); switch (scd->cmd_num) { case SENDER_ON: case SENDER_OFF: @@ -247,14 +248,14 @@ int com_sender(int fd, int argc, char * const * argv) return ret; } for (i = 0; i < 10; i++) { - mmd_lock(); + mutex_lock(mmd_mutex); if (mmd->sender_cmd_data.cmd_num >= 0) { - mmd_unlock(); + mutex_unlock(mmd_mutex); usleep(100 * 1000); continue; } mmd->sender_cmd_data = scd; - mmd_unlock(); + mutex_unlock(mmd_mutex); break; } return (i < 10)? 1 : -E_LOCK; @@ -269,7 +270,7 @@ int com_si(int fd, int argc, __a_unused char * const * argv) if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); for (i = 0; senders[i].name; i++) { char *info = senders[i].info(); sender_info = para_strcat(sender_info, info); @@ -279,7 +280,8 @@ int com_si(int fd, int argc, __a_unused char * const * argv) } ut = uptime_str(); ret = send_va_buffer(fd, "up: %s\nplayed: %u\n" - "pid: %d\n" + "server_pid: %d\n" + "afs_pid: %d\n" "connections (active/accepted/total): %u/%u/%u\n" "current loglevel: %i\n" "supported audio formats: %s\n" @@ -287,6 +289,7 @@ int com_si(int fd, int argc, __a_unused char * const * argv) "%s", ut, mmd->num_played, (int)getppid(), + (int)mmd->afs_pid, mmd->active_connections, mmd->num_commands, mmd->num_connects, @@ -295,7 +298,7 @@ int com_si(int fd, int argc, __a_unused char * const * argv) sender_list, sender_info ); - mmd_unlock(); + mutex_unlock(mmd_mutex); free(ut); free(sender_list); free(sender_info); @@ -444,10 +447,10 @@ int com_play(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); mmd->new_vss_status_flags |= VSS_PLAYING; mmd->new_vss_status_flags &= ~VSS_NOMORE; - mmd_unlock(); + mutex_unlock(mmd_mutex); return 1; } @@ -457,11 +460,11 @@ int com_stop(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); mmd->new_vss_status_flags &= ~VSS_PLAYING; mmd->new_vss_status_flags &= ~VSS_REPOS; mmd->new_vss_status_flags |= VSS_NEXT; - mmd_unlock(); + mutex_unlock(mmd_mutex); return 1; } @@ -470,13 +473,13 @@ int com_pause(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); if (!vss_paused() && !vss_stopped()) { mmd->events++; mmd->new_vss_status_flags &= ~VSS_PLAYING; mmd->new_vss_status_flags &= ~VSS_NEXT; } - mmd_unlock(); + mutex_unlock(mmd_mutex); return 1; } @@ -485,10 +488,10 @@ int com_next(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); mmd->events++; mmd->new_vss_status_flags |= VSS_NEXT; - mmd_unlock(); + mutex_unlock(mmd_mutex); return 1; } @@ -497,10 +500,10 @@ int com_nomore(__a_unused int fd, int argc, __a_unused char * const * argv) { if (argc != 1) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); if (vss_playing() || vss_paused()) mmd->new_vss_status_flags |= VSS_NOMORE; - mmd_unlock(); + mutex_unlock(mmd_mutex); return 1; } @@ -518,7 +521,7 @@ int com_ff(__a_unused int fd, int argc, char * const * argv) return -E_COMMAND_SYNTAX; if (ret > 1 && c == '-') backwards = 1; /* jmp backwards */ - mmd_lock(); + mutex_lock(mmd_mutex); ret = -E_NO_AUDIO_FILE; if (!mmd->afd.afhi.chunks_total || !mmd->afd.afhi.seconds_total) goto out; @@ -539,7 +542,7 @@ int com_ff(__a_unused int fd, int argc, char * const * argv) mmd->events++; ret = 1; out: - mmd_unlock(); + mutex_unlock(mmd_mutex); return ret; } @@ -553,7 +556,7 @@ int com_jmp(__a_unused int fd, int argc, char * const * argv) return -E_COMMAND_SYNTAX; if (sscanf(argv[1], "%lu", &i) <= 0) return -E_COMMAND_SYNTAX; - mmd_lock(); + mutex_lock(mmd_mutex); ret = -E_NO_AUDIO_FILE; if (!mmd->afd.afhi.chunks_total) goto out; @@ -568,7 +571,7 @@ int com_jmp(__a_unused int fd, int argc, char * const * argv) ret = 1; mmd->events++; out: - mmd_unlock(); + mutex_unlock(mmd_mutex); return ret; } @@ -791,9 +794,9 @@ __noreturn void handle_connect(int fd, const char *peername) /* valid command and sufficient perms */ alarm(0); argc = split_args(command, &argv, "\n"); - mmd_lock(); + mutex_lock(mmd_mutex); mmd->num_commands++; - mmd_unlock(); + mutex_unlock(mmd_mutex); PARA_NOTICE_LOG("calling com_%s() for %s@%s\n", cmd->name, u->name, peername); ret = cmd->handler(fd, argc, argv); @@ -806,10 +809,10 @@ net_err: out: free(command); free(argv); - mmd_lock(); + mutex_lock(mmd_mutex); if (cmd && (cmd->perms & AFS_WRITE) && ret >= 0) mmd->events++; mmd->active_connections--; - mmd_unlock(); + mutex_unlock(mmd_mutex); exit(ret < 0? EXIT_FAILURE : EXIT_SUCCESS); }