io.c
上传用户:hxtd_72
上传日期:2007-06-06
资源大小:64k
文件大小:3k
源码类别:

驱动编程

开发平台:

C/C++

  1. /*
  2.     io.c.
  3.     Local I/O routines for ksymoops.
  4.     Copyright 1999 Keith Owens <kaos@ocs.com.au>.
  5.     Released under the GNU Public Licence, Version 2.
  6.  */
  7. #include "ksymoops.h"
  8. #include <errno.h>
  9. #include <malloc.h>
  10. #include <string.h>
  11. #include <sys/stat.h>
  12. int regular_file(const char *file, const char *msg)
  13. {
  14.     struct stat statbuf;
  15.     static char const procname[] = "regular_file";
  16.     if (stat(file, &statbuf)) {
  17. ERROR("%s stat %s failed", msg, file);
  18. perror(prefix);
  19. return 0;
  20.     }
  21.     if (!S_ISREG(statbuf.st_mode)) {
  22. ERROR("%s %s is not a regular file, ignored", msg, file);
  23. return 0;
  24.     }
  25.     return 1;
  26. }
  27. FILE *fopen_local(const char *file, const char *mode, const char *msg)
  28. {
  29.     FILE *f;
  30.     static char const procname[] = "fopen_local";
  31.     if (!(f = fopen(file, mode))) {
  32. ERROR("%s fopen '%s' failed", msg, file);
  33. perror(prefix);
  34.     }
  35.     return f;
  36. }
  37. void fclose_local(FILE *f, const char *msg)
  38. {
  39.     int i;
  40.     static char const procname[] = "fclose_local";
  41.     if ((i = fclose(f))) {
  42. ERROR("%s fclose failed %d", msg, i);
  43. perror(prefix);
  44.     }
  45. }
  46. /* Read a line, increasing the size of the line as necessary until n is read.
  47.  * Any nulls or carriage return in the input are silently removed, both
  48.  * cause problems for string handling and printing.
  49.  */
  50. #define INCREMENT 10    /* arbitrary */
  51. char *fgets_local(char **line, int *size, FILE *f, const char *msg)
  52. {
  53.     char *l, *p, *r;
  54.     int longline = 1, s, u;
  55.     static char const procname[] = "fgets_local";
  56.     if (!*line) {
  57. *size = INCREMENT;
  58. *line = malloc(*size);
  59. if (!*line)
  60.     malloc_error("fgets_local alloc line");
  61.     }
  62.     l = *line;
  63.     while (longline) {
  64. s = *size-(l-*line);
  65. memset(l, '', s); /* in case the last line is not terminated */
  66. r = fgets(l, s, f);
  67. if (!r) {
  68.     if (ferror(f)) {
  69. ERROR("%s fgets failed", msg);
  70. perror(prefix);
  71.     }
  72.     if (l != *line)
  73. return(*line);
  74.     else
  75. return(NULL);
  76. }
  77. p = r = l;
  78. while (s--) {
  79.     if (*p && *p != 'r') {
  80. if (*p == 'n') {
  81.     *r++ = '';
  82.     longline = 0;
  83.     break;
  84. }
  85. else
  86.     *r++ = *p;
  87.     }
  88.     ++p;
  89. }
  90. if (longline) {
  91.     *size += INCREMENT;
  92.     u = r - *line;
  93.     *line = realloc(*line, *size);
  94.     if (!*line)
  95. malloc_error("fgets_local realloc line");
  96.     l = *line + u;
  97. }
  98.     }
  99.     /* convert tabs to spaces, assume tabwidth=8 */
  100. #define TABWIDTH 8
  101.     if ((p = strchr(*line, 't'))) {
  102. int i = 0;
  103. while (p) {
  104.     ++i;
  105.     p = strchr(p+1, 't');
  106. }
  107. if (strlen(*line) + 1 + i*(TABWIDTH-1) > *size)
  108.     *size += i*(TABWIDTH-1);    /* worst case expansion */
  109. l = malloc(*size);
  110. if (!l)
  111.     malloc_error("fgets_local tab expand alloc");
  112. memset(l, ' ', *size-1);
  113. *(l+*size-1) = '';
  114. p = *line;
  115. r = l;
  116. while (*p) {
  117.     if (*p == 't')
  118. r += TABWIDTH - (p - *line) % TABWIDTH;
  119.     else
  120. *r++ = *p;
  121.     ++p;
  122. }
  123. *r = '';
  124. p = *line;
  125. *line = l;
  126. free(p);
  127.     }
  128.     DEBUG(4, "%s line '%s'", msg, *line);
  129.     return(*line);
  130. }
  131. FILE *popen_local(const char *cmd, const char *msg)
  132. {
  133.     FILE *f;
  134.     static char const procname[] = "popen_local";
  135.     if (!(f = popen(cmd, "r"))) {
  136. ERROR("%s popen '%s' failed", msg, cmd);
  137. perror(prefix);
  138.     }
  139.     return f;
  140. }
  141. void pclose_local(FILE *f, const char *msg)
  142. {
  143.     int i;
  144.     static char const procname[] = "pclose_local";
  145.     errno = 0;
  146.     if ((i = pclose(f))) {
  147. ERROR("%s pclose failed 0x%x", msg, i);
  148. if (errno)
  149.     perror(prefix);
  150.     }
  151. }