File: D1273.test1.c

package info (click to toggle)
ble.sh 0.4.0~git20250321.d4c812b-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 12,516 kB
  • sloc: sh: 71,367; awk: 1,316; cpp: 750; ansic: 186; javascript: 43; makefile: 35
file content (62 lines) | stat: -rw-r--r-- 1,469 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// This is MinGW Program

#include <stdio.h>
#include <windows.h>
#include <sys/stat.h>

BOOL is_process_alive(HANDLE handle) {
  DWORD result;
  return GetExitCodeProcess(handle, &result) && result == STILL_ACTIVE;
}
BOOL is_file(const char* filename) {
  struct stat st;
  if (stat(filename, &st) == 0 && S_ISREG(st.st_mode)) return TRUE;
  return FALSE;
}

int main(int argc, char** argv) {
  const char* winpid = argv[1];
  const char* filename = argv[2];

  int ppid = atoi(winpid);
  if (!ppid) {
    fprintf(stderr, "invalid process ID '%s'\n", winpid);
    return 1;
  }
  HANDLE parent_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid);
  if (parent_process == NULL) {
    fprintf(stderr, "failed to open the parent process '%s'\n", winpid);
    return 1;
  }

  int exit_code = 0;
  BOOL terminate = FALSE;
  while (!terminate) {
    FILE* f = fopen(filename, "r");
    if (!f) {
      fprintf(stderr, "failed to open the file '%s'\n", filename);
      terminate = TRUE;
      exit_code = 1;
      break;
    }
    unlink(filename);
    for (;;) {
      if (!is_process_alive(parent_process)) {
        terminate = TRUE;
        break;
      }
      if (is_file(filename)) break; // reopen

      int count = 0;
      char buff[4096];
      while (count = fread(&buff, 1, sizeof buff, f))
        fwrite(buff, 1, count, stdout);
      fflush(stdout);
      Sleep(20);
    }
    fclose(f);
  }

  CloseHandle(parent_process);
  return exit_code;
}