win32_test.c
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:9k
源码类别:

Audio

开发平台:

Unix_Linux

  1. /*
  2. ** Copyright (C) 2001-2009 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. **
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU General Public License as published by
  6. ** the Free Software Foundation; either version 2 of the License, or
  7. ** (at your option) any later version.
  8. **
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU General Public License for more details.
  13. **
  14. ** You should have received a copy of the GNU General Public License
  15. ** along with this program; if not, write to the Free Software
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include "sfconfig.h"
  19. #include "sndfile.h"
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #if HAVE_UNISTD_H
  23. #include <unistd.h>
  24. #endif
  25. #if (HAVE_DECL_S_IRGRP == 0)
  26. #include <sf_unistd.h>
  27. #endif
  28. #include <string.h>
  29. #include <fcntl.h>
  30. #include <errno.h>
  31. #include <sys/types.h>
  32. #include <sys/stat.h>
  33. #define SIGNED_SIZEOF(x) ((int) sizeof (x))
  34. /* EMX is OS/2. */
  35. #if defined (__CYGWIN__) || defined (__EMX__)
  36. #define LSEEK lseek
  37. #define FSTAT fstat
  38. typedef struct stat STATBUF ;
  39. typedef off_t INT64 ;
  40. static char dir_cmd [] = "ls -l" ;
  41. #elif (defined (WIN32) || defined (_WIN32))
  42. #define LSEEK _lseeki64
  43. #define FSTAT _fstati64
  44. typedef struct _stati64 STATBUF ;
  45. typedef __int64 INT64 ;
  46. static char dir_cmd [] = "dir" ;
  47. #else
  48. #define LSEEK lseek
  49. #define FSTAT fstat
  50. typedef struct stat STATBUF ;
  51. typedef sf_count_t INT64 ;
  52. #define O_BINARY 0
  53. static char dir_cmd [] = "ls -l" ;
  54. #endif
  55. static void show_fstat_error (void) ;
  56. static void show_lseek_error (void) ;
  57. static void show_stat_fstat_error (void) ;
  58. static void write_to_closed_file (void) ;
  59. int
  60. main (void)
  61. {
  62. puts ("nnnn"
  63. "This program shows up errors in the Win32 implementation ofn"
  64. "a couple of POSIX API functions on some versions of windoze.n"
  65. "It can also be compiled on Linux (which works correctly) andn"
  66. "other OSes just to provide a sanity check.n"
  67. ) ;
  68. show_fstat_error () ;
  69. show_lseek_error () ;
  70. show_stat_fstat_error () ;
  71. write_to_closed_file () ;
  72. puts ("nn") ;
  73. return 0 ;
  74. } /* main */
  75. static void
  76. show_fstat_error (void)
  77. { static const char *filename = "fstat.dat" ;
  78. static char data [256] ;
  79. STATBUF  statbuf ;
  80. int fd, mode, flags, ignored ;
  81. if (sizeof (statbuf.st_size) != sizeof (INT64))
  82. { printf ("nnLine %d: Error, sizeof (statbuf.st_size) != 8.nn", __LINE__) ;
  83. return ;
  84. } ;
  85. puts ("n64 bit fstat() test.n--------------------") ;
  86. printf ("0) Create a file, write %d bytes and close it.n", SIGNED_SIZEOF (data)) ;
  87. mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
  88. flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
  89. if ((fd = open (filename, mode, flags)) < 0)
  90. { printf ("nnLine %d: open() failed : %snn", __LINE__, strerror (errno)) ;
  91. return ;
  92. } ;
  93. ignored = write (fd, data, sizeof (data)) ;
  94. close (fd) ;
  95. printf ("1) Re-open file in read/write mode and write another %d bytes at the end.n", SIGNED_SIZEOF (data)) ;
  96. mode = O_RDWR | O_BINARY ;
  97. flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
  98. if ((fd = open (filename, mode, flags)) < 0)
  99. { printf ("nnLine %d: open() failed : %snn", __LINE__, strerror (errno)) ;
  100. return ;
  101. } ;
  102. LSEEK (fd, 0, SEEK_END) ;
  103. ignored = write (fd, data, sizeof (data)) ;
  104. printf ("2) Now use system ("%s %s") to show the file length.nn", dir_cmd, filename) ;
  105. /* Would use snprintf, but thats not really available on windows. */
  106. memset (data, 0, sizeof (data)) ;
  107. strncpy (data, dir_cmd, sizeof (data) - 1) ;
  108. strncat (data, " ", sizeof (data) - 1 - strlen (data)) ;
  109. strncat (data, filename, sizeof (data) - 1 - strlen (data)) ;
  110. ignored = system (data) ;
  111. puts ("") ;
  112. printf ("3) Now use fstat() to get the file length.n") ;
  113. if (FSTAT (fd, &statbuf) != 0)
  114. { printf ("nnLine %d: fstat() returned error : %sn", __LINE__, strerror (errno)) ;
  115. return ;
  116. } ;
  117. printf ("4) According to fstat(), the file length is %ld, ", (long) statbuf.st_size) ;
  118. close (fd) ;
  119. if (statbuf.st_size != 2 * sizeof (data))
  120. printf ("but thats just plain ***WRONG***.nn") ;
  121. else
  122. { printf ("which is correct.nn") ;
  123. unlink (filename) ;
  124. } ;
  125. } /* show_fstat_error */
  126. static void
  127. show_lseek_error (void)
  128. { static const char *filename = "fstat.dat" ;
  129. static char data [256] ;
  130. INT64 retval ;
  131. int fd, mode, flags, ignored ;
  132. puts ("n64 bit lseek() test.n--------------------") ;
  133. printf ("0) Create a file, write %d bytes and close it.n", SIGNED_SIZEOF (data)) ;
  134. mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
  135. flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
  136. if ((fd = open (filename, mode, flags)) < 0)
  137. { printf ("nnLine %d: open() failed : %snn", __LINE__, strerror (errno)) ;
  138. return ;
  139. } ;
  140. ignored = write (fd, data, sizeof (data)) ;
  141. close (fd) ;
  142. printf ("1) Re-open file in read/write mode and write another %d bytes at the end.n", SIGNED_SIZEOF (data)) ;
  143. mode = O_RDWR | O_BINARY ;
  144. flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
  145. if ((fd = open (filename, mode, flags)) < 0)
  146. { printf ("nnLine %d: open() failed : %snn", __LINE__, strerror (errno)) ;
  147. return ;
  148. } ;
  149. LSEEK (fd, 0, SEEK_END) ;
  150. ignored = write (fd, data, sizeof (data)) ;
  151. printf ("2) Now use system ("%s %s") to show the file length.nn", dir_cmd, filename) ;
  152. /* Would use snprintf, but thats not really available on windows. */
  153. memset (data, 0, sizeof (data)) ;
  154. strncpy (data, dir_cmd, sizeof (data) - 1) ;
  155. strncat (data, " ", sizeof (data) - 1 - strlen (data)) ;
  156. strncat (data, filename, sizeof (data) - 1 - strlen (data)) ;
  157. ignored = system (data) ;
  158. puts ("") ;
  159. printf ("3) Now use lseek() to go to the end of the file.n") ;
  160. retval = LSEEK (fd, 0, SEEK_END) ;
  161. printf ("4) We are now at position %ld, ", (long) retval) ;
  162. close (fd) ;
  163. if (retval != 2 * sizeof (data))
  164. printf ("but thats just plain ***WRONG***.nn") ;
  165. else
  166. { printf ("which is correct.nn") ;
  167. unlink (filename) ;
  168. } ;
  169. } /* show_lseek_error */
  170. static void
  171. show_stat_fstat_error (void)
  172. { static const char *filename = "stat_fstat.dat" ;
  173. static char data [256] ;
  174. int fd, mode, flags ;
  175. int stat_size, fstat_size, ignored ;
  176. struct stat buf ;
  177. /* Known to fail on WinXP. */
  178. puts ("nstat/fstat test.n----------------") ;
  179. printf ("0) Create a file and write %d bytes.n", SIGNED_SIZEOF (data)) ;
  180. mode = O_WRONLY | O_CREAT | O_TRUNC | O_BINARY ;
  181. flags = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ;
  182. if ((fd = open (filename, mode, flags)) < 0)
  183. { printf ("nnLine %d: open() failed : %snn", __LINE__, strerror (errno)) ;
  184. return ;
  185. } ;
  186. ignored = write (fd, data, sizeof (data)) ;
  187. printf ("1) Now call stat and fstat on the file and retreive the file lengths.n") ;
  188. if (stat (filename, &buf) != 0)
  189. { printf ("nnLine %d: stat() failed : %snn", __LINE__, strerror (errno)) ;
  190. goto error_exit ;
  191. } ;
  192. stat_size = buf.st_size ;
  193. if (fstat (fd, &buf) != 0)
  194. { printf ("nnLine %d: fstat() failed : %snn", __LINE__, strerror (errno)) ;
  195. goto error_exit ;
  196. } ;
  197. fstat_size = buf.st_size ;
  198. printf ("2) Size returned by stat and fstat is %d and %d, ", stat_size, fstat_size) ;
  199. if (stat_size == 0 || stat_size != fstat_size)
  200. printf ("but thats just plain ***WRONG***.nn") ;
  201. else
  202. printf ("which is correct.nn") ;
  203. error_exit :
  204. close (fd) ;
  205. unlink (filename) ;
  206. return ;
  207. } /* show_stat_fstat_error */
  208. static void
  209. write_to_closed_file (void)
  210. { const char * filename = "closed_write_test.txt" ;
  211. struct stat buf ;
  212. FILE * file ;
  213. int fd, ignored ;
  214. puts ("nWrite to closed file test.n--------------------------") ;
  215. printf ("0) First we open file for write using fopen().n") ;
  216. if ((file = fopen (filename, "w")) == NULL)
  217. { printf ("nnLine %d: fopen() failed : %snn", __LINE__, strerror (errno)) ;
  218. return ;
  219. } ;
  220. printf ("1) Now we grab the file descriptor fileno().n") ;
  221. fd = fileno (file) ;
  222. printf ("2) Write some text via the file descriptor.n") ;
  223. ignored = write (fd, "an", 2) ;
  224. printf ("3) Now we close the file using fclose().n") ;
  225. fclose (file) ;
  226. stat (filename, &buf);
  227. printf ("   File size is %d bytes.n", (int) buf.st_size) ;
  228. printf ("4) Now write more data to the file descriptor which should fail.n") ;
  229. if (write (fd, "bn", 2) < 0)
  230. printf ("5) Good, write returned an error code as it should have.n") ;
  231. else
  232. { printf ("5) Attempting to write to a closed file should have failed but didn't! *** WRONG ***n") ;
  233. stat (filename, &buf);
  234. printf ("   File size is %d bytes.n", (int) buf.st_size) ;
  235. } ;
  236. unlink (filename) ;
  237. return ;
  238. } /* write_to_closed_file */