Skip to content
Snippets Groups Projects
Commit 667296c9 authored by Jenkins2's avatar Jenkins2 Committed by Gerrit Code Review
Browse files

Merge "app_voicemail: Fix file copy error handling."

parents 0100c926 f2f51ff4
No related branches found
No related tags found
No related merge requests found
...@@ -4647,49 +4647,56 @@ static int copy(char *infile, char *outfile) ...@@ -4647,49 +4647,56 @@ static int copy(char *infile, char *outfile)
{ {
int ifd; int ifd;
int ofd; int ofd;
int res; int res = -1;
int len; int len;
char buf[4096]; char buf[4096];
   
#ifdef HARDLINK_WHEN_POSSIBLE #ifdef HARDLINK_WHEN_POSSIBLE
/* Hard link if possible; saves disk space & is faster */ /* Hard link if possible; saves disk space & is faster */
if (link(infile, outfile)) { if (!link(infile, outfile)) {
return 0;
}
#endif #endif
if ((ifd = open(infile, O_RDONLY)) < 0) {
ast_log(AST_LOG_WARNING, "Unable to open %s in read-only mode: %s\n", infile, strerror(errno)); if ((ifd = open(infile, O_RDONLY)) < 0) {
return -1; ast_log(AST_LOG_WARNING, "Unable to open %s in read-only mode: %s\n", infile, strerror(errno));
return -1;
}
if ((ofd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, VOICEMAIL_FILE_MODE)) < 0) {
ast_log(AST_LOG_WARNING, "Unable to open %s in write-only mode: %s\n", outfile, strerror(errno));
close(ifd);
return -1;
}
for (;;) {
int wrlen;
len = read(ifd, buf, sizeof(buf));
if (!len) {
res = 0;
break;
} }
if ((ofd = open(outfile, O_WRONLY | O_TRUNC | O_CREAT, VOICEMAIL_FILE_MODE)) < 0) {
ast_log(AST_LOG_WARNING, "Unable to open %s in write-only mode: %s\n", outfile, strerror(errno)); if (len < 0) {
close(ifd); ast_log(AST_LOG_WARNING, "Read failed on %s: %s\n", infile, strerror(errno));
return -1; break;
}
wrlen = write(ofd, buf, len);
if (errno == ENOMEM || errno == ENOSPC || wrlen != len) {
ast_log(AST_LOG_WARNING, "Write failed on %s (%d of %d): %s\n", outfile, wrlen, len, strerror(errno));
break;
} }
do {
len = read(ifd, buf, sizeof(buf));
if (len < 0) {
ast_log(AST_LOG_WARNING, "Read failed on %s: %s\n", infile, strerror(errno));
close(ifd);
close(ofd);
unlink(outfile);
} else if (len) {
res = write(ofd, buf, len);
if (errno == ENOMEM || errno == ENOSPC || res != len) {
ast_log(AST_LOG_WARNING, "Write failed on %s (%d of %d): %s\n", outfile, res, len, strerror(errno));
close(ifd);
close(ofd);
unlink(outfile);
}
}
} while (len);
close(ifd);
close(ofd);
return 0;
#ifdef HARDLINK_WHEN_POSSIBLE
} else {
/* Hard link succeeded */
return 0;
} }
#endif
close(ifd);
close(ofd);
if (res) {
unlink(outfile);
}
return res;
} }
   
/*! /*!
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment