| ... | ... | @@ -705,17 +705,6 @@ const ArgsIterator = struct { |
| 705 | 705 | } |
| 706 | 706 | }; |
| 707 | 707 | |
| 708 | | fn cleanupTempStdinFile( |
| 709 | | temp_stdin_file: ?[]const u8, |
| 710 | | local_cache_directory: Compilation.Directory, |
| 711 | | ) void { |
| 712 | | if (temp_stdin_file) |file| { |
| 713 | | // Some garbage may stay in the file system if removal fails; this |
| 714 | | // is harmless so no warning is needed. |
| 715 | | local_cache_directory.handle.deleteFile(file) catch {}; |
| 716 | | } |
| 717 | | } |
| 718 | | |
| 719 | 708 | fn buildOutputType( |
| 720 | 709 | gpa: Allocator, |
| 721 | 710 | arena: Allocator, |
| ... | ... | @@ -3031,13 +3020,6 @@ fn buildOutputType( |
| 3031 | 3020 | break :l global_cache_directory; |
| 3032 | 3021 | }; |
| 3033 | 3022 | |
| 3034 | | var temp_stdin_file: ?[]const u8 = null; |
| 3035 | | // Note that in one of the happy paths, execve() is used to switch to clang |
| 3036 | | // in which case this cleanup logic does not run and this temp file is |
| 3037 | | // leaked. Oh well. It's a minor punishment for using `-x c` which nobody |
| 3038 | | // should be doing. |
| 3039 | | defer cleanupTempStdinFile(temp_stdin_file, local_cache_directory); |
| 3040 | | |
| 3041 | 3023 | for (c_source_files.items) |*src| { |
| 3042 | 3024 | if (!mem.eql(u8, src.src_path, "-")) continue; |
| 3043 | 3025 | |
| ... | ... | @@ -3045,21 +3027,22 @@ fn buildOutputType( |
| 3045 | 3027 | fatal("-E or -x is required when reading from a non-regular file", .{}); |
| 3046 | 3028 | |
| 3047 | 3029 | // "-" is stdin. Dump it to a real file. |
| 3048 | | const sub_path = blk: { |
| 3049 | | const sep = fs.path.sep_str; |
| 3050 | | const sub_path = try std.fmt.allocPrint(arena, "tmp" ++ sep ++ "{x}-stdin{s}", .{ |
| 3051 | | std.crypto.random.int(u64), ext.canonicalName(target_info.target), |
| 3052 | | }); |
| 3053 | | try local_cache_directory.handle.makePath("tmp"); |
| 3054 | | var f = try local_cache_directory.handle.createFile(sub_path, .{}); |
| 3055 | | defer f.close(); |
| 3056 | | errdefer local_cache_directory.handle.deleteFile(sub_path) catch {}; |
| 3057 | | try f.writeFileAll(io.getStdIn(), .{}); |
| 3058 | | break :blk sub_path; |
| 3059 | | }; |
| 3060 | | // Relative to `local_cache_directory`. |
| 3061 | | temp_stdin_file = sub_path; |
| 3062 | | // Relative to current working directory. |
| 3030 | const sep = fs.path.sep_str; |
| 3031 | const sub_path = try std.fmt.allocPrint(arena, "tmp" ++ sep ++ "{x}-stdin{s}", .{ |
| 3032 | std.crypto.random.int(u64), ext.canonicalName(target_info.target), |
| 3033 | }); |
| 3034 | try local_cache_directory.handle.makePath("tmp"); |
| 3035 | // Note that in one of the happy paths, execve() is used to switch |
| 3036 | // to clang in which case any cleanup logic that exists for this |
| 3037 | // temporary file will not run and this temp file will be leaked. |
| 3038 | // Oh well. It's a minor punishment for using `-x c` which nobody |
| 3039 | // should be doing. Therefore, we make no effort to clean up. Using |
| 3040 | // `-` for stdin as a source file always leaks a temp file. |
| 3041 | var f = try local_cache_directory.handle.createFile(sub_path, .{}); |
| 3042 | defer f.close(); |
| 3043 | try f.writeFileAll(io.getStdIn(), .{}); |
| 3044 | |
| 3045 | // Convert `sub_path` to be relative to current working directory. |
| 3063 | 3046 | src.src_path = try local_cache_directory.join(arena, &.{sub_path}); |
| 3064 | 3047 | } |
| 3065 | 3048 | |