BadVPN – Rev 1

Subversion Repositories:
Rev:
include_guard "temp_dir"

template temp_dir {
    objref_arg(_arg0) log;
    alias(@_arg1) temp_base_dir;
    alias(@_arg2) mktemp;
    alias(@_arg3) rm;

    # Create a temporary directory.
    var("") created_dir;
    Do {
        # Build the path template.
        value(@concat(temp_base_dir, "/build-")) temp_prefix;
        concat(temp_prefix, "XXXXXXXXXXXXXXXX") temp_template;
        
        # Call mktemp.
        call(@run_process_output, {{mktemp, "-d", temp_template}}) mktemp_res;
        
        # Check mktemp success.
        If (@not(mktemp_res.succeeded)) {
            log->call(@error, "mktemp failed");
            _do->break();
        };
        
        # Remove a trailing newline from the output.
        objref(^mktemp_res.output) output;
        If (@num_equal(output.length, "0")) {
            log->call(@error, "mktemp result is empty");
            _do->break();
        };
        var(@num_subtract(output.length, "1")) len_minus_one;
        output->substr(len_minus_one) last_char;
        If (@val_different(last_char, "\n")) {
            log->call(@error, "last char of mktemp result is not a newline");
            _do->break();
        };
        output->substr("0", len_minus_one) without_newline;
        output->reset(without_newline);
        
        # Check created dir prefix.
        output->substr("0", temp_prefix.length) created_prefix;
        If (@val_different(created_prefix, temp_prefix)) {
            log->call(@error, "mktemp result prefix incorrect");
            _do->break();
        };
        
        # Remember it.
        created_dir->set(output);
    } Interrupt {
        # Do not interrupt the directory creation, or we might
        # end up with creating but not removing a directory.
        if(@false);
    } dir_creation;
    
    # Expose success status.
    var(dir_creation.succeeded) succeeded;
    
    # Arrange for removing the temp dir.
    If (succeeded) {
        run({}, {rm, "-rf", created_dir});
    };
}