int get_macosx_version (int *major_version_num, int *minor_version_num, int *subminor_version_num) { int exit_status = 1; char *tmp_name = tmpnam(NULL); if (tmp_name == NULL) { perror(global_prog_name); goto error_cleanup; } char *uname_cmd; int ret = asprintf(&uname_cmd, "uname -r > %s", tmp_name); if (ret == -1 || uname_cmd == NULL) { fprintf(stderr, "Could not allocate enough memory for command string: uname -r > %s\n", tmp_name); goto error_cleanup; } ret = system(uname_cmd); if (ret != 0) { fprintf(stderr, "error in %s: system(\"%s\") returned %d\n", global_prog_name, uname_cmd, ret); goto error_cleanup; } FILE *f = fopen(tmp_name, "r"); if (f == NULL) { perror(global_prog_name); goto error_cleanup; } char buf[512]; if (fgets(buf, sizeof(buf), f) == NULL) { perror(global_prog_name); goto error_cleanup; } ret = sscanf(buf, "%d.%d.%d", major_version_num, minor_version_num, subminor_version_num); fclose(f); cleanup_temp_file(tmp_name); if (ret < 2) { fprintf(stderr, "%s: Output of 'uname -r' was '%s', from which no major and minor version number could be parsed.\n", global_prog_name, buf); exit(1); } return ret; error_cleanup: if (tmp_name != NULL) { cleanup_temp_file(tmp_name); } exit(exit_status); }
/* Delete a closed temporary FILE for diversion DIVNUM. */ static int m4_tmpremove (int divnum) { if (divnum == tmp_file1_owner) { int result = close_stream_temp (tmp_file1); if (result) return result; tmp_file1_owner = 0; } else if (divnum == tmp_file2_owner) { int result = close_stream_temp (tmp_file2); if (result) return result; tmp_file2_owner = 0; } return cleanup_temp_file (output_temp_dir, m4_tmpname (divnum)); }