[svn-commits] tilghman: branch tilghman/issue16461 r272049 - /team/tilghman/issue16461/funcs/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Jun 22 17:51:28 CDT 2010
Author: tilghman
Date: Tue Jun 22 17:51:25 2010
New Revision: 272049
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=272049
Log:
All write tests pass!
Modified:
team/tilghman/issue16461/funcs/func_env.c
Modified: team/tilghman/issue16461/funcs/func_env.c
URL: http://svnview.digium.com/svn/asterisk/team/tilghman/issue16461/funcs/func_env.c?view=diff&rev=272049&r1=272048&r2=272049
==============================================================================
--- team/tilghman/issue16461/funcs/func_env.c (original)
+++ team/tilghman/issue16461/funcs/func_env.c Tue Jun 22 17:51:25 2010
@@ -730,7 +730,18 @@
if (args.argc < 4 || !strchr(args.options, 'l')) {
/* Character-based mode */
- if (args.argc == 1) {
+ if (args.argc > 3 && strchr(args.options, 'a')) {
+ /* Append mode */
+ if (!(ff = fopen(args.filename, "a"))) {
+ ast_log(LOG_WARNING, "Cannot open file '%s' for appending: %s\n", args.filename, strerror(errno));
+ return 0;
+ }
+ if (fwrite(value, 1, vlength, ff) < vlength) {
+ ast_log(LOG_ERROR, "Short write?!!\n");
+ }
+ fclose(ff);
+ return 0;
+ } else if (offset == 0 && length == LLONG_MAX) {
if (!(ff = fopen(args.filename, "w"))) {
ast_log(LOG_WARNING, "Cannot open file '%s' for writing: %s\n", args.filename, strerror(errno));
return 0;
@@ -740,17 +751,6 @@
}
fclose(ff);
return 0;
- } else if (args.argc > 3 && strchr(args.options, 'a')) {
- /* Append mode */
- if (!(ff = fopen(args.filename, "a"))) {
- ast_log(LOG_WARNING, "Cannot open file '%s' for appending: %s\n", args.filename, strerror(errno));
- return 0;
- }
- if (fwrite(value, 1, vlength, ff) < vlength) {
- ast_log(LOG_ERROR, "Short write?!!\n");
- }
- fclose(ff);
- return 0;
}
if (!(ff = fopen(args.filename, "r+"))) {
@@ -871,7 +871,19 @@
return -1;
}
- if (offset == 0 && length == LLONG_MAX) {
+ if (strchr(args.options, 'a')) {
+ /* Append to file */
+ if (!(ff = fopen(args.filename, "a"))) {
+ ast_log(LOG_ERROR, "Unable to open '%s' for appending: %s\n", args.filename, strerror(errno));
+ return -1;
+ }
+ if (fwrite(value, 1, vlength, ff) < vlength) {
+ ast_log(LOG_ERROR, "Short write?!!\n");
+ } else if (!strchr(args.options, 'd') && fwrite(format2term(newline_format), 1, strlen(format2term(newline_format)), ff) < strlen(format2term(newline_format))) {
+ ast_log(LOG_ERROR, "Short write?!!\n");
+ }
+ fclose(ff);
+ } else if (offset == 0 && length == LLONG_MAX) {
/* Overwrite file */
off_t truncsize;
if (!(ff = fopen(args.filename, "w"))) {
@@ -888,18 +900,6 @@
if (truncate(args.filename, truncsize)) {
ast_log(LOG_ERROR, "Unable to truncate file: %s\n", strerror(errno));
}
- } else if (strchr(args.options, 'a')) {
- /* Append to file */
- if (!(ff = fopen(args.filename, "a"))) {
- ast_log(LOG_ERROR, "Unable to open '%s' for appending: %s\n", args.filename, strerror(errno));
- return -1;
- }
- if (fwrite(value, 1, vlength, ff) < vlength) {
- ast_log(LOG_ERROR, "Short write?!!\n");
- } else if (!strchr(args.options, 'd') && fwrite(format2term(newline_format), 1, strlen(format2term(newline_format)), ff) < strlen(format2term(newline_format))) {
- ast_log(LOG_ERROR, "Short write?!!\n");
- }
- fclose(ff);
} else {
int64_t offset_offset = (offset == 0 ? 0 : -1), length_offset = -1, flength, i, current_length = 0;
char dos_state = 0, fbuf[4096];
@@ -930,7 +930,7 @@
if (fseeko(ff, i, SEEK_SET)) {
ast_log(LOG_ERROR, "Cannot seek to offset %" PRId64 ": %s\n", i, strerror(errno));
}
- if (i + sizeof(fbuf) <= flength) {
+ if (i + sizeof(fbuf) >= flength) {
memset(fbuf, 0, sizeof(fbuf));
}
if (fread(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf) && !feof(ff)) {
@@ -942,7 +942,7 @@
LINE_COUNTER(pos, newline_format, count);
if (length < 0 && count * -1 == length) {
- length_offset = i + (pos - fbuf) + 1;
+ length_offset = i + (pos - fbuf);
} else if (offset < 0 && count * -1 == (offset - 1)) {
/* Found our initial offset. We're done with reverse motion! */
if (newline_format == FF_DOS) {
@@ -1005,7 +1005,7 @@
/* Positive line length */
if (length_offset < 0) {
- fseeko(ff, SEEK_SET, offset_offset);
+ fseeko(ff, offset_offset, SEEK_SET);
for (i = offset_offset; i < flength; i += sizeof(fbuf)) {
char *pos;
if (i + sizeof(fbuf) >= flength) {
@@ -1030,12 +1030,10 @@
}
if (length_offset < 0) {
/* Exceeds length of file */
+ ast_debug(1, "Exceeds length of file? length=%" PRId64 ", count=%" PRId64 ", flength=%" PRId64 "\n", length, current_length, flength);
length_offset = flength;
}
}
-
- ast_debug(1, "offset=%s/%" PRId64 ", length=%s/%" PRId64 ", vlength=%" PRId64 ", flength=%" PRId64 "\n",
- args.offset, offset_offset, args.length, length_offset, vlength, flength);
/* Have offset_offset and length_offset now */
if (length_offset - offset_offset == vlength + (strchr(args.options, 'd') ? 0 : strlen(format2term(newline_format)))) {
@@ -1050,40 +1048,50 @@
} else if (length_offset - offset_offset > vlength + (strchr(args.options, 'd') ? 0 : strlen(format2term(newline_format)))) {
/* More complex case - need to shorten file */
off_t cur;
+ int64_t length_length = length_offset - offset_offset;
+ size_t vlen = vlength + (strchr(args.options, 'd') ? 0 : strlen(format2term(newline_format)));
+
+ ast_debug(1, "offset=%s/%" PRId64 ", length=%s/%" PRId64 " (%" PRId64 "), vlength=%" PRId64 ", flength=%" PRId64 "\n",
+ args.offset, offset_offset, args.length, length_offset, length_length, vlength, flength);
+
fseeko(ff, offset_offset, SEEK_SET);
if (fwrite(value, 1, vlength, ff) < vlength) {
ast_log(LOG_ERROR, "Short write?!!\n");
fclose(ff);
return -1;
- } else if (!strchr(args.options, 'd') && fwrite(format2term(newline_format), 1, strlen(format2term(newline_format)), ff) < strlen(format2term(newline_format))) {
+ } else if (!strchr(args.options, 'd') && fwrite(format2term(newline_format), 1, vlen - vlength, ff) < vlen - vlength) {
ast_log(LOG_ERROR, "Short write?!!\n");
fclose(ff);
return -1;
}
while ((cur = ftello(ff)) < flength) {
- fseek(ff, length_offset - offset_offset, SEEK_CUR);
+ fseeko(ff, length_length - vlen, SEEK_CUR);
if (fread(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf) && !feof(ff)) {
ast_log(LOG_ERROR, "Short read?!!\n");
fclose(ff);
return -1;
}
- fseek(ff, cur + offset_offset - length_offset, SEEK_SET);
+ /* Seek to where we last stopped writing */
+ fseeko(ff, cur, SEEK_SET);
if (fwrite(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf)) {
ast_log(LOG_ERROR, "Short write?!!\n");
fclose(ff);
return -1;
}
}
- fflush(ff);
- if (ftruncate(fileno(ff), flength - (length_offset - offset_offset - vlength))) {
+ fclose(ff);
+ if (truncate(args.filename, flength - (length_length - vlen))) {
ast_log(LOG_ERROR, "Truncation of file failed: %s\n", strerror(errno));
}
- fclose(ff);
} else {
/* Most complex case - need to lengthen file */
size_t vlen = vlength + (strchr(args.options, 'd') ? 0 : strlen(format2term(newline_format)));
int64_t origlen = length_offset - offset_offset;
off_t lastwritten = flength + vlen - origlen;
+
+ ast_debug(1, "offset=%s/%" PRId64 ", length=%s/%" PRId64 ", vlength=%" PRId64 ", flength=%" PRId64 "\n",
+ args.offset, offset_offset, args.length, length_offset, vlength, flength);
+
fseeko(ff, vlen - origlen, SEEK_END);
while (offset_offset + sizeof(fbuf) < ftello(ff)) {
ast_debug(1, "Tests should not get here\n");
More information about the svn-commits
mailing list