aboutsummaryrefslogtreecommitdiffstats
path: root/frame.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-05-04 00:18:05 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2001-05-04 00:18:05 +0000
commitc2abcf234f0aeaa94462f04af99950c0340e1983 (patch)
treee2a853573a1a8c34b8bb8b77daea51f50747db9e /frame.c
parent006395f49a116551029c974d0f23aa4e46589361 (diff)
Version 0.1.8 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@311 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'frame.c')
-rwxr-xr-xframe.c71
1 files changed, 44 insertions, 27 deletions
diff --git a/frame.c b/frame.c
index 9f1c3dda8..17b8582c4 100755
--- a/frame.c
+++ b/frame.c
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <errno.h>
/*
* Important: I should be made more efficient. Frame headers should
@@ -108,38 +109,45 @@ struct ast_frame *ast_fr_fdread(int fd)
{
char buf[4096];
int res;
+ int ttl = sizeof(struct ast_frame);
struct ast_frame *f = (struct ast_frame *)buf;
/* Read a frame directly from there. They're always in the
right format. */
- if (read(fd, buf, sizeof(struct ast_frame))
- == sizeof(struct ast_frame)) {
- /* read the frame header */
- f->mallocd = 0;
- /* Re-write data position */
- f->data = buf + sizeof(struct ast_frame);
- f->offset = 0;
- /* Forget about being mallocd */
- f->mallocd = 0;
- /* Re-write the source */
- f->src = __FUNCTION__;
- if (f->datalen > sizeof(buf) - sizeof(struct ast_frame)) {
- /* Really bad read */
- ast_log(LOG_WARNING, "Strange read (%d bytes)\n", f->datalen);
+ while(ttl) {
+ res = read(fd, buf, ttl);
+ if (res < 0) {
+ ast_log(LOG_WARNING, "Bad read on %d: %s\n", fd, strerror(errno));
return NULL;
}
- if (f->datalen) {
- if ((res = read(fd, f->data, f->datalen)) != f->datalen) {
- /* Bad read */
- ast_log(LOG_WARNING, "How very strange, expected %d, got %d\n", f->datalen, res);
- return NULL;
- }
+ ttl -= res;
+ }
+
+ /* read the frame header */
+ f->mallocd = 0;
+ /* Re-write data position */
+ f->data = buf + sizeof(struct ast_frame);
+ f->offset = 0;
+ /* Forget about being mallocd */
+ f->mallocd = 0;
+ /* Re-write the source */
+ f->src = __FUNCTION__;
+ if (f->datalen > sizeof(buf) - sizeof(struct ast_frame)) {
+ /* Really bad read */
+ ast_log(LOG_WARNING, "Strange read (%d bytes)\n", f->datalen);
+ return NULL;
+ }
+ if (f->datalen) {
+ if ((res = read(fd, f->data, f->datalen)) != f->datalen) {
+ /* Bad read */
+ ast_log(LOG_WARNING, "How very strange, expected %d, got %d\n", f->datalen, res);
+ return NULL;
}
- return ast_frisolate(f);
- } else if (option_debug)
- ast_log(LOG_DEBUG, "NULL or invalid header\n");
- /* Null if there was an error */
- return NULL;
+ }
+ if ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP)) {
+ return NULL;
+ }
+ return ast_frisolate(f);
}
/* Some convenient routines for sending frames to/from stream or datagram
@@ -149,16 +157,25 @@ int ast_fr_fdwrite(int fd, struct ast_frame *frame)
{
/* Write the frame exactly */
if (write(fd, frame, sizeof(struct ast_frame)) != sizeof(struct ast_frame)) {
- ast_log(LOG_WARNING, "Write error\n");
+ ast_log(LOG_WARNING, "Write error: %s\n", strerror(errno));
return -1;
}
if (write(fd, frame->data, frame->datalen) != frame->datalen) {
- ast_log(LOG_WARNING, "Write error\n");
+ ast_log(LOG_WARNING, "Write error: %s\n", strerror(errno));
return -1;
}
return 0;
}
+int ast_fr_fdhangup(int fd)
+{
+ struct ast_frame hangup = {
+ AST_FRAME_CONTROL,
+ AST_CONTROL_HANGUP
+ };
+ return ast_fr_fdwrite(fd, &hangup);
+}
+
int ast_getformatbyname(char *name)
{
if (!strcasecmp(name, "g723.1"))