From 74600d9030a3cbd53b43ccda099e482aed7357cb Mon Sep 17 00:00:00 2001 From: markster Date: Sun, 16 Oct 2005 16:12:51 +0000 Subject: Use FILE * instead of fd for files to support buffering git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6801 f38db490-d61c-443f-a65b-d21fe96a405b --- file.c | 63 +++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 20 deletions(-) (limited to 'file.c') diff --git a/file.c b/file.c index 47a187d76..c4fac49d1 100755 --- a/file.c +++ b/file.c @@ -59,9 +59,9 @@ struct ast_format { /* Format of frames it uses/provides (one only) */ int format; /* Open an input stream, and start playback */ - struct ast_filestream * (*open)(int fd); + struct ast_filestream * (*open)(FILE * f); /* Open an output stream, of a given file descriptor and comment it appropriately if applicable */ - struct ast_filestream * (*rewrite)(int fd, const char *comment); + struct ast_filestream * (*rewrite)(FILE *f, const char *comment); /* Write a frame to a channel */ int (*write)(struct ast_filestream *, struct ast_frame *); /* seek num samples into file, whence(think normal seek) */ @@ -103,8 +103,8 @@ AST_MUTEX_DEFINE_STATIC(formatlock); static struct ast_format *formats = NULL; int ast_format_register(const char *name, const char *exts, int format, - struct ast_filestream * (*open)(int fd), - struct ast_filestream * (*rewrite)(int fd, const char *comment), + struct ast_filestream * (*open)(FILE *f), + struct ast_filestream * (*rewrite)(FILE *f, const char *comment), int (*write)(struct ast_filestream *, struct ast_frame *), int (*seek)(struct ast_filestream *, long sample_offset, int whence), int (*trunc)(struct ast_filestream *), @@ -351,6 +351,7 @@ static int ast_filehelper(const char *filename, const char *filename2, const cha struct ast_filestream *s; int res=0, ret = 0; char *ext=NULL, *exts, *fn, *nfn; + FILE *bfile; struct ast_channel *chan = (struct ast_channel *)filename2; /* Start with negative response */ @@ -413,9 +414,10 @@ static int ast_filehelper(const char *filename, const char *filename2, const cha case ACTION_OPEN: if ((ret < 0) && ((chan->writeformat & f->format) || ((f->format >= AST_FORMAT_MAX_AUDIO) && fmt))) { - ret = open(fn, O_RDONLY); - if (ret >= 0) { - s = f->open(ret); + bfile = fopen(fn, "r"); + if (bfile) { + ret = 1; + s = f->open(bfile); if (s) { s->lasttimeout = -1; s->fmt = f; @@ -426,11 +428,14 @@ static int ast_filehelper(const char *filename, const char *filename2, const cha else chan->vstream = s; } else { - close(ret); - ast_log(LOG_WARNING, "Unable to open fd on %s\n", fn); + fclose(bfile); + ast_log(LOG_WARNING, "Unable to open file on %s\n", fn); + ret = -1; } - } else + } else{ ast_log(LOG_WARNING, "Couldn't open file %s\n", fn); + ret = -1; + } } break; default: @@ -472,7 +477,6 @@ struct ast_filestream *ast_openstream_full(struct ast_channel *chan, const char set it up. */ - int fd = -1; int fmts = -1; char filename2[256]=""; char filename3[256]; @@ -508,8 +512,8 @@ struct ast_filestream *ast_openstream_full(struct ast_channel *chan, const char /* Set the channel to a format we can work with */ res = ast_set_write_format(chan, fmts); - fd = ast_filehelper(filename2, (char *)chan, NULL, ACTION_OPEN); - if (fd >= 0) + res = ast_filehelper(filename2, (char *)chan, NULL, ACTION_OPEN); + if (res >= 0) return chan->stream; return NULL; } @@ -819,7 +823,7 @@ int ast_streamfile(struct ast_channel *chan, const char *filename, const char *p struct ast_filestream *ast_readfile(const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode) { - int fd; + FILE *bfile; struct ast_format *f; struct ast_filestream *fs = NULL; char *fn; @@ -834,13 +838,13 @@ struct ast_filestream *ast_readfile(const char *filename, const char *type, cons continue; fn = build_filename(filename, type); - fd = open(fn, flags); - if (fd >= 0) { + bfile = fopen(fn, "r"); + if (bfile) { errno = 0; - if (!(fs = f->open(fd))) { + if (!(fs = f->open(bfile))) { ast_log(LOG_WARNING, "Unable to open %s\n", fn); - close(fd); + fclose(bfile); free(fn); continue; } @@ -866,6 +870,7 @@ struct ast_filestream *ast_readfile(const char *filename, const char *type, cons struct ast_filestream *ast_writefile(const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode) { int fd, myflags = 0; + FILE *bfile; struct ast_format *f; struct ast_filestream *fs = NULL; char *fn, *orig_fn = NULL; @@ -893,11 +898,20 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con fn = build_filename(filename, type); fd = open(fn, flags | myflags, mode); + if (fd > -1) { + /* fdopen() the resulting file stream */ + bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); + if (!bfile) { + ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); + close(fd); + fd = -1; + } + } if (option_cache_record_files && fd >= 0) { char *c; - close(fd); + fclose(bfile); /* We touch orig_fn just as a place-holder so other things (like vmail) see the file is there. What we are really doing is writing to record_cache_dir until we are done then we will mv the file into place. @@ -914,11 +928,20 @@ struct ast_filestream *ast_writefile(const char *filename, const char *type, con free(fn); fn = buf; fd = open(fn, flags | myflags, mode); + if (fd > -1) { + /* fdopen() the resulting file stream */ + bfile = fdopen(fd, ((flags | myflags) & O_RDWR) ? "w+" : "w"); + if (!bfile) { + ast_log(LOG_WARNING, "Whoa, fdopen failed: %s!\n", strerror(errno)); + close(fd); + fd = -1; + } + } } if (fd >= 0) { errno = 0; - if ((fs = f->rewrite(fd, comment))) { + if ((fs = f->rewrite(bfile, comment))) { fs->trans = NULL; fs->fmt = f; fs->flags = flags; -- cgit v1.2.3