📄 msg.c
字号:
/* $Header: /home/cvs/wavplay/msg.c,v 1.2 1999/12/04 00:01:20 wwg Exp $ * Warren W. Gay VE3WWG Tue Feb 25 22:45:09 1997 * * MESSAGE QUEUE FUNCTIONS: * * X LessTif WAV Play : * * Copyright (C) 1997 Warren W. Gay VE3WWG * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details (see enclosed file COPYING). * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. * * Send correspondance to: * * Warren W. Gay VE3WWG * * Email: * ve3wwg@yahoo.com * wgay@mackenziefinancial.com * * $Log: msg.c,v $ * Revision 1.2 1999/12/04 00:01:20 wwg * Implement wavplay-1.4 release changes * * Revision 1.1.1.1 1999/11/21 19:50:56 wwg * Import wavplay-1.3 into CVS * * Revision 1.1 1997/04/14 00:20:55 wwg * Initial revision * */static const char rcsid[] = "@(#)msg.c $Revision: 1.2 $";#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <unistd.h>#include <errno.h>#include <fcntl.h>#include <malloc.h>#include <string.h>#include <memory.h>#include <signal.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/ioctl.h>#include <assert.h>#include <linux/soundcard.h>#include "wavplay.h"/* * Create a private message queue: */intMsgCreate(void) { int ipcid; if ( (ipcid = msgget(IPC_PRIVATE,IPC_CREAT|0600)) < 0 ) return -1; /* Failed: check errno */ return ipcid; /* Success: ipcid */}/* * Close (remove) a message queue: */intMsgClose(int ipcid) { return msgctl(ipcid,IPC_RMID,NULL);}/* * Send a Client/Server message: * flags: 0 blocks on write * IPC_NOWAIT no blocking on write * Returns 0 if success, else -1 */intMsgSend(int ipcid,SVRMSG *msg,int flags,long msgtype) { UInt16 hdrlen; /* Length of the message header */ UInt16 len; /* Byte length of char mtext[] */ int z; /* Status return code */ msg->type = msgtype; /* 1=client, 2=server */ hdrlen = ((char *) &msg->u - (char *)msg) /* Get offset to the start of the union */ - sizeof msg->type; /* The message type does not get included */ len = hdrlen + msg->bytes; /* The final message length */ while ( (z = msgsnd(ipcid,(struct msgbuf *)msg,len,flags)) < 0 && errno == EINTR ) ; /* Repeat interrupted system calls */ if ( cmdopt_x ) fprintf(stderr,"%5d => Msg %s (%u bytes/%u) : %s\n", getpid(), msg_name(msg->msg_type), (unsigned)msg->bytes, (unsigned)len, z >= 0 ? "Sent" : "Not-sent"); return z >= 0 ? 0 : -1; /* Returns 0 if successful, else check errno */}/* * Receive a Client/Server Message: * flags: 0 blocks on read * IPC_NOWAIT no blocking on read * Returns 0 if success, else -1 */intMsgRecv(int ipcid,SVRMSG *msg,int flags,long msgtype) { int z; while ( (z = msgrcv(ipcid,(struct msgbuf *)msg,sizeof *msg-sizeof(long),msgtype,flags)) < 0 && errno == EINTR ) ; /* Repeat interrupted system calls */ if ( cmdopt_x && (flags == 0 || z >= 0) ) fprintf(stderr,"%5d <= Msg %s (%u bytes/%u) : %s\n", getpid(), msg_name(msg->msg_type), (unsigned)msg->bytes, (unsigned)z, z >= 0 ? "Recvd" : "Not-recvd"); return z >= 0 ? 0 : -1;}/* * Return a string name for the enumerated message type: */char *msg_name(MSGTYP mtyp) { int x = (int) mtyp; /* Message type as an (int) */ static char *msg_names[] = { "ToClnt_Fatal", /* Fatal server error */ "ToClnt_Ready", /* Tell client that server is ready */ "ToSvr_Bye", /* Client tells server to exit */ "ToSvr_Path", /* Client tells server a pathname */ "ToClnt_Path", /* Server acks pathname change */ "ToClnt_Stat", /* Server tells client stat info about pathname */ "ToClnt_WavInfo", /* Server responds with WAV header info */ "ToSvr_Play", /* Client tells server to play */ "ToSvr_Pause", /* Tell server to pause */ "ToSvr_Stop", /* Tell server to stop */ "ToSvr_Bits", /* Tell server new bits setting */ "ToClnt_Bits", /* Tell client current bits setting */ "ToClnt_Settings", /* Tell client current server settings */ "ToSvr_SamplingRate", /* Tell server new overriding sampling rate */ "ToSvr_Restore", /* Tell server to cancel overrides */ "ToSvr_Chan", /* Tell server new mono/stereo setting */ "ToSvr_Record", /* Tell server to start recording */ "ToSvr_Debug", /* Tell server debug mode setting */ "ToClnt_ErrMsg", /* Tell client an error message from server */ "ToSvr_SemReset", /* Tell server to reset its locking semaphores */ "ToSvr_StartSample", /* Tell server where to start playback from */ "ToClnt_PlayState", /* Tell client state of playback */ "ToClnt_RecState" /* Tell client state of recording */ }; static char buf[16]; if ( x < 0 || x >= (int) MSGTYP_Last ) { sprintf(buf,"msgtyp=%d",x); return buf; /* Wild message type */ } return msg_names[x]; /* Proper message type */}/* $Source: /home/cvs/wavplay/msg.c,v $ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -