- $foundit = false;
- if ( $markerdata ) {
- $state = true;
- foreach ( $markerdata as $n => $markerline ) {
- if (strpos($markerline, '# BEGIN ' . $marker) !== false)
- $state = false;
- if ( $state ) {
- if ( $n + 1 < count( $markerdata ) )
- fwrite( $f, "{$markerline}\n" );
- else
- fwrite( $f, "{$markerline}" );
- }
- if (strpos($markerline, '# END ' . $marker) !== false) {
- fwrite( $f, "# BEGIN {$marker}\n" );
- if ( is_array( $insertion ))
- foreach ( $insertion as $insertline )
- fwrite( $f, "{$insertline}\n" );
- fwrite( $f, "# END {$marker}\n" );
- $state = true;
- $foundit = true;
- }
- }
+ if ( ! is_array( $insertion ) ) {
+ $insertion = explode( "\n", $insertion );
+ }
+
+ $start_marker = "# BEGIN {$marker}";
+ $end_marker = "# END {$marker}";
+
+ $fp = fopen( $filename, 'r+' );
+ if ( ! $fp ) {
+ return false;
+ }
+
+ // Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.
+ flock( $fp, LOCK_EX );
+
+ $lines = array();
+ while ( ! feof( $fp ) ) {
+ $lines[] = rtrim( fgets( $fp ), "\r\n" );
+ }
+
+ // Split out the existing file into the preceeding lines, and those that appear after the marker
+ $pre_lines = $post_lines = $existing_lines = array();
+ $found_marker = $found_end_marker = false;
+ foreach ( $lines as $line ) {
+ if ( ! $found_marker && false !== strpos( $line, $start_marker ) ) {
+ $found_marker = true;
+ continue;
+ } elseif ( ! $found_end_marker && false !== strpos( $line, $end_marker ) ) {
+ $found_end_marker = true;
+ continue;