[svn-commits] tilghman: branch tilghman/issue16461 r271517 - in /team/tilghman/issue16461: ...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Jun 19 00:11:11 CDT 2010


Author: tilghman
Date: Sat Jun 19 00:11:08 2010
New Revision: 271517

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=271517
Log:
Fixed the last of the read tests

Modified:
    team/tilghman/issue16461/funcs/func_env.c
    team/tilghman/issue16461/tests/test_func_file.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=271517&r1=271516&r2=271517
==============================================================================
--- team/tilghman/issue16461/funcs/func_env.c (original)
+++ team/tilghman/issue16461/funcs/func_env.c Sat Jun 19 00:11:08 2010
@@ -76,7 +76,6 @@
 		<syntax>
 			<parameter name="filename" required="true">
 				<para>File to write or modify.</para>
-			</argument>
 			</parameter>
 			<parameter name="offset">
 				<para>Maybe specified as any number. If negative, <replaceable>offset</replaceable> specifies the number
@@ -567,6 +566,10 @@
 	}
 	flength = ftello(ff);
 
+	if (length == LLONG_MAX) {
+		length_offset = flength;
+	}
+
 	/* For negative offset and/or negative length */
 	if (offset < 0 || length < 0) {
 		int64_t count = 0;
@@ -614,7 +617,7 @@
 				LINE_COUNTER(pos, format, count);
 
 				if (count == offset) {
-					offset_offset = i + (pos - fbuf);
+					offset_offset = i + (pos - fbuf) + 1;
 					break;
 				}
 			}
@@ -631,18 +634,21 @@
 	}
 
 	ast_str_reset(*buf);
-	fseeko(ff, SEEK_SET, offset_offset);
+	if (fseeko(ff, offset_offset, SEEK_SET)) {
+		ast_log(LOG_ERROR, "fseeko failed: %s\n", strerror(errno));
+	}
 
 	/* If we have both offset_offset and length_offset, then grabbing the
 	 * buffer is simply a matter of just retrieving the file and adding it
 	 * to buf.  Otherwise, we need to run byte-by-byte forward until the
 	 * length is complete. */
 	if (length_offset >= 0) {
-		ast_debug(1, "offset=%" PRId64 ", length=%" PRId64 ", offset_offset=%" PRId64 ", length_offset=%" PRId64 "\n", offset, length, offset_offset, length_offset);
+		ast_debug(3, "offset=%" PRId64 ", length=%" PRId64 ", offset_offset=%" PRId64 ", length_offset=%" PRId64 "\n", offset, length, offset_offset, length_offset);
 		for (i = offset_offset; i < length_offset; i += sizeof(fbuf)) {
-			if ((readlen = fread(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf))) {
-				/* This is expected on the last time through the loop */
-			}
+			if (fread(fbuf, 1, i + sizeof(fbuf) > flength ? flength - i : sizeof(fbuf), ff) < (i + sizeof(fbuf) > flength ? flength - i : sizeof(fbuf))) {
+				ast_log(LOG_ERROR, "Short read?!!\n");
+			}
+			ast_debug(3, "Appending first %" PRId64" bytes of fbuf=%s\n", i + sizeof(fbuf) > length_offset ? length_offset - i : sizeof(fbuf), fbuf);
 			ast_str_append_substr(buf, len, fbuf, i + sizeof(fbuf) > length_offset ? length_offset - i : sizeof(fbuf));
 		}
 	} else if (length == 0) {
@@ -651,11 +657,11 @@
 		/* Positive line offset */
 		int64_t current_length = 0;
 		char dos_state = 0;
-		ast_debug(1, "offset=%" PRId64 ", length=%" PRId64 ", offset_offset=%" PRId64 ", length_offset=%" PRId64 "\n", offset, length, offset_offset, length_offset);
+		ast_debug(3, "offset=%" PRId64 ", length=%" PRId64 ", offset_offset=%" PRId64 ", length_offset=%" PRId64 "\n", offset, length, offset_offset, length_offset);
 		for (i = offset_offset; i < flength; i += sizeof(fbuf)) {
 			char *pos;
-			if ((readlen = fread(fbuf, 1, sizeof(fbuf), ff)) < sizeof(fbuf)) {
-				memset(&fbuf[readlen], 0, sizeof(fbuf) - readlen);
+			if ((readlen = fread(fbuf, 1, sizeof(fbuf), ff)) < sizeof(fbuf) && !feof(ff)) {
+				ast_log(LOG_ERROR, "Short read?!!\n");
 			}
 			for (pos = fbuf; pos < fbuf + sizeof(fbuf); pos++) {
 				LINE_COUNTER(pos, format, current_length);
@@ -665,8 +671,8 @@
 					break;
 				}
 			}
-			ast_debug(1, "length_offset=%" PRId64 ", length_offset - i=%" PRId64 "\n", length_offset, length_offset - i);
-			ast_str_append_substr(buf, len, fbuf, length_offset >= 0 ? length_offset - i : sizeof(fbuf));
+			ast_debug(3, "length_offset=%" PRId64 ", length_offset - i=%" PRId64 "\n", length_offset, length_offset - i);
+			ast_str_append_substr(buf, len, fbuf, length_offset >= 0 ? length_offset - i : flength > i + sizeof(fbuf)) ? sizeof(fbuf) : flength - i;
 
 			if (length_offset >= 0) {
 				break;
@@ -742,8 +748,15 @@
 		fseeko(ff, 0, SEEK_END);
 		flength = ftello(ff);
 
+		if (offset < 0) {
+			if (fseeko(ff, offset, SEEK_END)) {
+				ast_log(LOG_ERROR, "Cannot seek to offset: %s\n", strerror(errno));
+			}
+			offset = ftello(ff);
+		}
+
 		if (length < 0) {
-			length += flength;
+			length = flength - offset + length;
 			if (length < 0) {
 				ast_log(LOG_ERROR, "Length '%s' exceeds the file length.  No data will be written.\n", args.length);
 				fclose(ff);
@@ -751,7 +764,10 @@
 			}
 		}
 
-		fseeko(ff, offset, offset < 0 ? SEEK_END : SEEK_SET);
+		fseeko(ff, offset, SEEK_SET);
+
+		ast_debug(1, "offset=%s/%" PRId64 ", length=%s/%" PRId64 ", vlength=%" PRId64 ", flength=%" PRId64 "\n",
+			args.offset, offset, args.length, length, vlength, flength);
 
 		if (length == vlength) {
 			/* Simplest case, a straight replace */
@@ -764,23 +780,23 @@
 			if (fwrite(value, 1, vlength, ff) < vlength) {
 				ast_log(LOG_ERROR, "Short write?!!\n");
 			}
-			fflush(ff);
-			if (ftruncate(fileno(ff), ftello(ff))) {
+			fclose(ff);
+			if (truncate(args.filename, offset + vlength)) {
 				ast_log(LOG_ERROR, "Unable to truncate the file: %s\n", strerror(errno));
 			}
-			fclose(ff);
 		} else if (length > vlength) {
 			/* More complex -- need to close a gap */
 			char fbuf[4096];
+			off_t cur;
 			if (fwrite(value, 1, vlength, ff) < vlength) {
 				ast_log(LOG_ERROR, "Short write?!!\n");
 			}
-			while (ftello(ff) < flength) {
-				fseeko(ff, length - vlength, SEEK_CUR);
+			fseeko(ff, length - vlength, SEEK_CUR);
+			while ((cur = ftello(ff)) < flength) {
 				if (fread(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf) && !feof(ff)) {
 					ast_log(LOG_ERROR, "Short read?!!\n");
 				}
-				fseeko(ff, vlength - length, SEEK_CUR);
+				fseeko(ff, cur + vlength - length, SEEK_CUR);
 				if (fwrite(fbuf, 1, sizeof(fbuf), ff) < sizeof(fbuf)) {
 					ast_log(LOG_ERROR, "Short write?!!\n");
 				}

Modified: team/tilghman/issue16461/tests/test_func_file.c
URL: http://svnview.digium.com/svn/asterisk/team/tilghman/issue16461/tests/test_func_file.c?view=diff&rev=271517&r1=271516&r2=271517
==============================================================================
--- team/tilghman/issue16461/tests/test_func_file.c (original)
+++ team/tilghman/issue16461/tests/test_func_file.c Sat Jun 19 00:11:08 2010
@@ -255,13 +255,8 @@
 		fclose(fh);
 
 		if (strcmp(fbuf, write_tests[i].contents2)) {
-			if (strchr(write_tests[i].contents2, '\n')) {
-				ast_test_status_update(test, "Expression 'FILE(...,%s)=%s' did not produce a file with the expected result\n",
-					write_tests[i].args, write_tests[i].value);
-			} else {
-				ast_test_status_update(test, "Expression 'FILE(...,%s)=%s' did not produce ('%s') the expected result ('%s')\n",
-					write_tests[i].args, write_tests[i].value, file2display(&disp[0], 0, fbuf), file2display(&disp[1], 0, write_tests[i].contents2));
-			}
+			ast_test_status_update(test, "Expression 'FILE(...,%s)=%s' did not produce ('%s') the expected result ('%s')\n",
+				write_tests[i].args, write_tests[i].value, file2display(&disp[0], 0, fbuf), file2display(&disp[1], 0, write_tests[i].contents2));
 			res = AST_TEST_FAIL;
 		}
 	}




More information about the svn-commits mailing list