Annotation of embedaddon/php/ext/standard/tests/file/file.inc, revision 1.1.1.1
1.1 misho 1: <?php
2: /* Header file for common file test functions
3: Following functions are provided :
4: create_files() : create files with specified contents
5: delete_files() : delete files
6: create_links() : crate links of different types
7: delete_links() : delete links
8: fill_files() : fill file with specified contents
9: change_file_perms() : Change permission of files
10: fill_buffer() : fills buffer with specified contents
11: compare_self_stat() : compares the first 13 elements of the
12: stat with the corresponding named key values of
13: the same stat.
14: compare_stats() : Compares two stat values
15:
16: */
17:
18: define('file_not_found', 2, 1);
19:
20: /*
21: Function: bool create_file(string $filename, string $mode = "w");
22: Description: creates a new file using fopen() call
23: $filename = Name of the file
24: $mode = Mode as specified in fopen call, read documentation of fopen() call for more info
25:
26: Returns:
27: true on success, false otherwise
28: */
29: function create_file($filename, $mode = "w") {
30: $file_handle = fopen ($filename, $mode);
31: if ( $file_handle == false )
32: return false;
33: fclose($file_handle);
34: return true;
35: }
36:
37: /*
38: Function : bool fill_buffer(string &$buffer, string $fill_type, int $fill_size);
39: Description: Fills the $buffer with data as specified with requested size.
40: $buffer = buffer to be filled
41: $fill_type:
42: "text" = fills with string of size $file_size
43: "numeric" = fills with numeric value of size $file_size
44: "text_with_new_line" = similar to "text" fill type but writes with new line
45: "alphanumeric" = fills with alphnumeric values
46: Returns: true on success, false on invalid fill type
47: */
48: function fill_buffer(&$buffer, $fill_type, $fill_size) {
49:
50: if ( $fill_type == "text" ) {
51: $data = "text ";
52: $size_divider = strlen($data);
53: $add_value = strlen($data);
54: } else if ( $fill_type == "text_with_new_line" ) {
55: $data = "line\nline of text\n";
56: $size_divider = strlen($data);
57: $add_value = strlen($data);
58: } else if ( $fill_type == "alphanumeric" ) {
59: $data = "ab12 ";
60: $size_divider = strlen($data);
61: $add_value = strlen($data);
62: } else if ( $fill_type == "numeric" ) {
63: $data = 2;
64: $size_divider = 1;
65: $add_value = 0;
66: } else {
67: // invalid fill type;
68: return false;
69: }
70:
71: $tmp_buff = str_repeat($data, ($fill_size/$size_divider) + $add_value );
72:
73: if ( strlen($tmp_buff) > $fill_size ) {
74: $buffer = substr($tmp_buff, 0, $fill_size);
75: } else {
76: $buffer = $tmp_buff;
77: }
78:
79: return true;
80: }
81:
82: /*
83: Function : bool fill_file(resource $file_handle, string $fill_type, string $file_size);
84: Description: Fills the file with data as specified with requested size.
85: $file_handle = file handle, opened with write options,
86: $fill_type:
87: "text" = fills with string of size $file_size
88: "numeric" = fills with numeric value of size $file_size
89: "empty" = no fill operation performed, returns true
90: "text_with_new_line" = similar to "text" fill type but writes with new line
91: "alphanumeric" = fills with alphnumeric values
92: Returns: true on success, false on failure & invalid fill type
93: */
94:
95: function fill_file($file_handle, $fill_type, $file_size) {
96:
97: if ( $fill_type == "empty" ) {
98: // no fill required, return true
99: return true;
100: } if ( $fill_type == "text" ) {
101: $data = "text ";
102: $size_divider = strlen($data);
103: $add_value = strlen($data);
104: } else if ( $fill_type == "text_with_new_line" ) {
105: $data = "line\nline of text\n";
106: $size_divider = strlen($data);
107: $add_value = strlen($data);
108: } else if ( $fill_type == "alphanumeric" ) {
109: $data = "ab12 ";
110: $size_divider = strlen($data);
111: $add_value = strlen($data);
112: } else if ( $fill_type == "numeric" ) {
113: $data = 2;
114: $size_divider = 1;
115: $add_value = 0;
116: } else {
117: // invalid fill type;
118: return false;
119: }
120:
121: // write in terms of a chunk of 1 K to avoid memory size overflow
122: $size = $file_size;
123: $chunk_size = 1024;
124: if ( $size > $chunk_size ) {
125: $loop_count = 1;
126: do {
127: $loop_count ++;
128: if ( $size <= $chunk_size ) {
129: $chunk_size = $size;
130: }
131: $num_values = str_repeat($data, ($chunk_size/$size_divider) + $add_value );
132: $bytes_written = fwrite($file_handle, $num_values, $chunk_size);
133: if ( $bytes_written != $chunk_size ) {
134: return false;
135: }
136: $size -= $chunk_size;
137: } while ( $size > 0 );
138: } else {
139: $num_values = str_repeat($data, ($chunk_size/$size_divider) + $add_value );
140: $bytes_written = fwrite($file_handle, $num_values, $file_size);
141: if ( $bytes_written != $file_size ) {
142: return false;
143: }
144: }
145:
146: // successful, return true
147: return true;
148: }
149:
150: /*
151: Function: int change_file_perms(string $file_path, int $count = 1, int $perms = 0755,
152: string $name_prefix = "file",
153: string $name_suffix = 1, $file_extension = ".tmp");
154: Description: changes file permission for given file(s).
155: $file_path = dir path where file exists
156: $count = no. of files, default is 1
157: $perms = new permission of the file, similar to $mode args of chmod() call
158: $name_prefix = common name prefix, default is "file"
159: $name_suffix = suffix to end the common name given in name_prefix to create
160: a unique name. default is 1.
161: $file_extension = default is .tmp
162: Returns:
163: Integer, Count of total files permission changed.
164: */
165: function change_file_perms($file_path,
166: $count = 1,
167: $perms = 0755,
168: $name_prefix = "file",
169: $name_suffix = 1,
170: $file_extension = ".tmp" )
171: {
172: $changed = 0;
173:
174: if( $count <= 0 )
175: return $changed;
176:
177: if ( $name_suffix <= 0)
178: $name_suffix = 1;
179:
180: for($loop_counter = 1; $loop_counter <= $count; $loop_counter++) {
181: $filename = $file_path."/".$name_prefix.$name_suffix.$file_extension;
182: if( chmod($filename, $perms) )
183: $changed++;
184: $name_suffix++;
185: }
186: return $changed;
187: }
188:
189: /*
190: Function: array create_files( string $file_path,
191: int $count = 1,
192: string $content_type = "numeric",
193: int $permission = 0755,
194: int $size = 1,
195: string $mode = "w",
196: string $name_prefix = "file",
197: int $name_suffix = 1,
198: string $flag = "kilobytes"
199: string $file_extension = ".tmp"
200: );
201: Description: Creates given number of files with specified mode and
202: permissions. File is filled with content of size specified.
203: $file_path = dir where files will be created
204: $name_prefix = prefix to be used for names, name is suffix with a
205: unqiue numeric value to make the file name unique, default = file
206: $name_suffix = suffix to be used for the name, default = 1
207: $count = total no. of files to be created, default = 1
208: $mode = file open mode as specified in fopen() call. Do not use
209: modes used for only reading the file. Default = "w"
210: $permission = An octal number, This should be similar to $mode
211: specified in chmod() call.
212: $content_type = Specify type of the content to fill in the file.
213: "numeric" = fill file with numeric vlaues
214: "text" = fill file with regular text
215: "empty" = empty file
216: "text_with_new_line" = similar to text fill type, but writes with new line char
217: "alphanumeric" = fill file with alpha numeric text
218: If imporper $content type is specified, file is created as empty
219: $size = size of the fill in terms of kilobyte, i.e size of the file.
220: if $flag is specified as "byte", then then given size is taken in bytes
221: $flag = specifiy if size has to be treated as no of total bytes or
222: multiple of KB.
223: "kilobytes" = take size in terms of multiple of KB
224: "byte" = take size in terms of bytes
225: $file_extension = default is .tmp
226:
227: Returns:
228: An array with following key value pair:
229: created => total file created
230: filled => total files filled
231: perms_changed => total files permission changed
232: */
233: function create_files( $file_path,
234: $count = 1,
235: $content_type = "numeric",
236: $permission = 0755,
237: $size = 1,
238: $mode = "w",
239: $name_prefix = "file",
240: $name_suffix = 1,
241: $flag = "kilobytes",
242: $file_extension = ".tmp"
243: )
244: {
245: $return_value = array('created' => 0, 'filled' => 0, 'perms_changed' => 0);
246:
247: //ensure that suffix is a +ve integer
248: if ($name_suffix <= 0) {
249: $name_suffix = 1;
250: }
251:
252: // check for proper size
253: if ( $size == 0 )
254: return $return_value;
255:
256: // prepare the size based on flag
257: $file_size = $size;
258: if ( $flag == "kilobytes" ) {
259: $file_size = $file_size * 1024;
260: }
261:
262: $tmp_name_suffix = $name_suffix;
263: // create the files with specified mode and permission
264: for($file_created_count = 1; $file_created_count <= $count; $file_created_count ++) {
265: $filename = $file_path."/".$name_prefix.$tmp_name_suffix.$file_extension;
266:
267: $status = create_file($filename, $mode);
268:
269: $tmp_name_suffix++;
270:
271: if ($status == true) {
272: $return_value['created']++;
273: }
274: else {
275: return $return_value;
276: }
277: }
278:
279: if ( $content_type == "empty" ) {
280: $return_value['filled'] = $count;
281: } else {
282: // fill the file with specifiec type of data and size
283: $tmp_name_suffix = $name_suffix;
284: for($loop_counter = 1; $loop_counter <= $count; $loop_counter ++) {
285: $filename = $file_path."/".$name_prefix.$tmp_name_suffix.$file_extension;
286: $file_handle = fopen($filename, $mode);
287: if($file_handle == false) {
288: fclose($file_handle);
289: return $return_value;
290: } // end of if
291:
292: // call fill_file() to fill the file
293: if( fill_file($file_handle, $content_type, $file_size) )
294: $return_value['filled']++;
295:
296: fclose($file_handle);
297:
298: $tmp_name_suffix++;
299: } // end of for
300: }
301:
302: // change all file's permissions
303: $return_value['perms_changed'] = change_file_perms($file_path, $count, $permission, $name_prefix,
304: $name_suffix, $file_extension);
305:
306: return $return_value;
307: }
308:
309:
310: /*
311: Function: function create_links( $file_path,
312: $filename,
313: $link_count = 1,
314: $link_type = "soft",
315: $link_size = 1024,
316: $link_name_prefix = "link",
317: $link_name_suffix = 1,
318: $link_file_content = "text",
319: $link_perms = 0755,
320: $link_file_extension = ".tmp"
321: );
322:
323: Description: Creates given number of links with specified mode and
324: permissions.Link is filled with content of size specified.
325: $file_path = location of the file and where links need to be created
326: $link_name_prefix = prefix to be used for names, name is suffix with a
327: unique numeric value to make the file name unique, default = link
328: $link_name_suffix = suffix to be used for the name, default = 1
329: $link_count = total no. of links to be created to given file, default = 1
330: $link_perms = An octal number, This should be similar to $mode
331: specified in chmod() call.
332: $link_file_content = Type of the content to fill in the file.
333: numeric = fill file with numeric vlaues
334: text = fill file with regular text
335: text_with_new_line = same as text but new lines are written
336: alphanumeric = fill with alphanumeric text
337: If imporper $content type is specified, file is created as empty
338: $size = size of the fill in terms of kilobyte, i.e size of the file.
339: $link_type = type of the link to be created
340: "soft" = soft link
341: "hard" = hard link
342: $filename = file used to create a link on
343:
344: Returns:
345: An array with following key value pair:
346: created => total file created
347: filled => total files filled, always returned as 1
348: perms_changed => total files permission changed
349: */
350: function create_links($file_path,
351: $filename,
352: $link_count = 1,
353: $link_type = "soft",
354: $link_size = 1024,
355: $link_name_prefix = "link",
356: $link_name_suffix = 1,
357: $link_file_content = "text",
358: $link_perms = 0755,
359: $link_file_extension = ".tmp"
360: )
361: {
362: $return_value = array('created' => 0, 'filled' => 0, 'perms_changed' => 0);
363: $tmp_name_suffix = $link_name_suffix;
364: $src_filename = $file_path."/".$filename;
365: switch( $link_type ) {
366: default :
367: case "soft" : // create a soft link
368: for($link_created_count = 1; $link_created_count <= $link_count; $link_created_count++) {
369: $linkname = $file_path."/".$link_name_prefix.$tmp_name_suffix.$link_file_extension;
370: $status = symlink( $src_filename, $linkname);
371: $tmp_name_suffix++;
372: if ($status) {
373: $return_value['created']++;
374: }
375: else {
376: $return_value;
377: }
378: }
379: break;
380:
381: case "hard" : // create a hard link
382: for($link_created_count = 1; $link_created_count <= $link_count; $link_created_count++) {
383: $linkname = $file_path."/".$link_name_prefix.$tmp_name_suffix.$link_file_extension;
384: $status = link($src_filename, $linkname);
385: $tmp_name_suffix++;
386: if ($status) {
387: $return_value['created']++;
388: }
389: else {
390: $return_value;
391: }
392: }
393: break;
394: }
395:
396: if ( $link_file_content == "empty" ) {
397: $return_value['filled'] = 1;
398: return $return_value;
399: }
400:
401: // fill the file with specific type of data and size
402: $tmp_name_suffix = $link_name_suffix;
403: $linkname = $file_path."/".$link_name_prefix.$tmp_name_suffix.$link_file_extension;
404: $file_handle = fopen($linkname, "w");
405: if($file_handle == false) {
406: return $return_value;
407: } // end of if
408:
409: // call fill_file() to fill the file
410: if( fill_file($file_handle, $link_file_content, $link_size) )
411: $return_value['filled']++;
412:
413: // close the link
414: fclose($file_handle);
415:
416: // change the permission of the link file, only if hard link.
417: // this is not applicable to soft links
418: if( $link_type == "hard" ) {
419: $return_value['perms_changed'] = change_file_perms($file_path,
420: $link_count,
421: $link_perms,
422: $link_name_prefix,
423: $link_name_suffix,
424: $link_file_extension );
425: }
426:
427: return $return_value;
428: }
429:
430: /*
431: Function: bool delete_file(string $filename);
432: Description: delete a given file if exists
433: Returns: true on success
434: false on failure
435: file_not_found if file doesn't exist
436: */
437: function delete_file($filename) {
438: // check if file exists
439: if ( file_exists($filename) ) {
440: if ( unlink($filename) )
441: return true;
442: else
443: return false;
444: }
445: return file_not_found;
446: }
447:
448: /*
449: Function: array delete_files(string $file_path, int $count = 1, string $name_prefix = "file",
450: int name_suffix = 1, $file_extension = ".tmp" );
451: Description: Deletes given number of files if exists.
452: $file_path = location of the files
453: $name_prefix = prefix for the filename, rest of the name is incremental(increment by 1 only)
454: numeric starting from suffix upto count
455: $count = number of files to be deleted
456: $name_suffix = first numeric suffix in the name
457: Returns: An array with following key/value pair
458: deleted = Number of files deleted.
459: notfound = Count of non existing file
460: failed = Count of failed to delete
461: */
462: function delete_files($file_path,
463: $count = 1,
464: $name_prefix = "file",
465: $name_suffix = 1,
466: $file_extension = ".tmp")
467: {
468: $return_value = array ('deleted' => 0, 'notfound' => 0, 'failed' => 0);
469:
470: if ( $name_suffix < 1 )
471: $name_suffix = 1;
472: for($loop_counter = 1; $loop_counter <= $count; $loop_counter++) {
473: $filename = $file_path."/".$name_prefix.$name_suffix.$file_extension;
474: $name_suffix++;
475: $status = delete_file($filename);
476: if($status == true) {
477: $return_value['deleted']++;
478: } else if($status == file_not_found) {
479: $return_value['notfound']++;
480: } else {
481: $return_value['failed']++;
482: }
483:
484: } // end of for
485: return $return_value;
486: }
487:
488: /*
489: Function: array delete_links( $file_path,
490: $link_file_count,
491: $link_name_prefix,
492: $link_name_suffix,
493: $link_file_extension );
494: Description: Deletes given number of links if exists. Uses delete_files() function
495: $file_path = location of link files
496: $link_file_count = Number of link files
497: $link_name_prefix = prefix for the linkname, rest of the name is incremental(increment by 1 only)
498: numeric starting from $link_name_suffix upto count
499: $link_name_suffix = first numeric suffix in the name
500:
501: Returns: An array with following key/value pair
502: deleted = Number of links deleted.
503: notfound = Count of non existing link
504: failed = Count of failed to delete
505: */
506: function delete_links($file_path,
507: $link_file_count = 1,
508: $link_name_prefix = "link",
509: $link_name_suffix = 1,
510: $link_file_extension = ".tmp")
511: {
512: // call the delete files to delete links
513: $return_value = delete_files( $file_path,
514: $link_file_count,
515: $link_name_prefix,
516: $link_name_suffix,
517: $link_file_extension );
518: return $return_value;
519: }
520:
521:
522:
523: /*
524: Prototype:
525: function compare_self_stat( array $stat );
526: Description:
527: Compares the each of the first 13 values of the stat array with the
528: corresponding next 13 values of the same stat for equality
529: $stat = stat array
530:
531: Retuns: true when all of them match, false otherwise
532: */
533: function compare_self_stat( array $stat )
534: {
535: //return value
536: $return_value = true;
537:
538: // named keys present in a stat
539: $string_keys = array("dev", "ino", "mode", "nlink", "uid", "gid",
540: "rdev", "size", "atime", "mtime", "ctime",
541: "blksize", "blocks");
542:
543: // first numeric key
544: $key = 0;
545:
546: // compare the values in the stat, which are accessed using numeric key with
547: // values accessed using string keys
548: foreach($string_keys as $str_key)
549: {
550: if($stat[$key] != $stat[$str_key]) {
551: echo "Error: stat[$key] doesn't match with stat[$str_key]\n";
552: $flag = false;
553: $key++;
554: }
555: else {
556: $key++;
557: }
558: } // end of foreach
559:
560: // if the $return_value is false, i.e all the element do not match then
561: // dump the stat array so that its easy to figure out the error
562: if ($return_value == false ) {
563: echo "\n Dumping stat array ...\n";
564: var_dump($stat);
565: }
566:
567: return $return_value;
568: }// end of compare_self_stat
569:
570: /*
571: Prototype:
572: function compare_stats( array $stat1, array $stat2, array $fields,
573: [string $op = "==", [ bool $flag = false] ]);
574: Description:
575: Compares two stat values, stat value should be obtained by stat/lstat
576: $stat1 = first stat array
577: $stat2 = second stat array
578: $op = type of the comparision to be perform between elements of stat1 and stat2
579: "!=" compare for not equal
580: "==" compare for equality
581: ">" if each element of stat1 is > than stat2
582: "<" if each element of stat1 is < than stat2
583: $fields = contains the key of the elements that needs to be compared.
584: type of the comparision is based on $op argument value
585: $flag = specify true to dump the stat1 and stat2
586: */
587:
588: $all_stat_keys = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
589: "dev", "ino", "mode", "nlink", "uid", "gid",
590: "rdev", "size", "atime", "mtime", "ctime",
591: "blksize", "blocks");
592:
593: function compare_stats($stat1, $stat2, $fields, $op = "==", $flag = false ) {
594: // dump the stat if requested
595: if ( $flag == true ) {
596: var_dump($stat1);
597: var_dump($stat2);
598: }
599:
600: $result = true;
601:
602: // compare values of given key from each stat array
603: for($index = 0; $index < count($fields); $index++)
604: {
605: switch( $op )
606: {
607: case "==":
608: if ( $stat1[ $fields[$index] ] != $stat2[ $fields[$index] ] ) {
609: $result = false;
610: echo "Error: stat1 do not match with stat2 at key value: $fields[$index]\n";
611: }
612: break;
613:
614: case "!=":
615: if ( $stat1[ $fields[$index] ] != $stat2[ $fields[$index] ] ) {
616: // do nothing as its not equal, else will take care of if equal
617: } else {
618: $result = false;
619: echo "Error: stat1 equals stat2 at key value: $fields[$index]\n";
620: }
621: break;
622:
623: case ">":
624: if ( $stat1[ $fields[$index] ] <= $stat2[ $fields[$index] ] ) {
625: $result = false;
626: echo "Error: stat1 is not greater than stat2 at key value: $fields[$index]\n";
627: }
628: break;
629:
630: case "<":
631: if ( $stat1[ $fields[$index] ] >= $stat2[ $fields[$index] ] ) {
632: $result = false;
633: echo "Error: stat1 is not lesser than stat2 at key value: $fields[$index]\n";
634: }
635: break;
636: }
637: }
638: // if the result is false(i.e values are not as expected),
639: // dump the stat array so that easy to figure out the error
640: if ( $result == false ) {
641: echo "\n Dumping stat array 1...\n";
642: var_dump($stat1);
643: echo "\n Dumping stat array 2...\n";
644: var_dump($stat2);
645: }
646:
647: return $result;
648: }
649:
650: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>