[Asterisk-cvs] asterisk file.c,1.76,1.77
markster
markster
Sun Oct 16 12:18:44 CDT 2005
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv23387
Modified Files:
file.c
Log Message:
Use FILE * instead of fd for files to support buffering
Index: file.c
===================================================================
RCS file: /usr/cvsroot/asterisk/file.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -d -r1.76 -r1.77
--- file.c 14 Sep 2005 20:46:49 -0000 1.76
+++ file.c 16 Oct 2005 16:12:51 -0000 1.77
@@ -59,9 +59,9 @@
/* 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 @@
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 @@
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 @@
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 @@
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 @@
set it up.
*/
- int fd = -1;
int fmts = -1;
char filename2[256]="";
char filename3[256];
@@ -508,8 +512,8 @@
/* 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 @@
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 @@
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_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 @@
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 @@
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;
More information about the svn-commits
mailing list