int64_t copy_stream_to_buffer(FILE *input, char **buffer, size_t *len) { size_t _len; if (len == NULL) len = &_len; int64_t total = 0; buffer_t B; buffer_init(&B); while(1) { char buffer[COPY_BUFFER_SIZE]; int64_t actual_read = full_fread(input, buffer, COPY_BUFFER_SIZE); if(actual_read <= 0) { if (total == 0) return -1; else break; } if (buffer_putlstring(&B, buffer, actual_read) == -1) { buffer_free(&B); return -1; } total += actual_read; } buffer_dupl(&B, buffer, len); buffer_free(&B); return total; }
//Using default sampling interval. We may want to add an option //to change it. char *resource_monitor_write_command(const char *monitor_path, const char *template_filename, const struct rmsummary *limits, const char *extra_monitor_options, int debug_output, int time_series, int inotify_stats) { buffer_t cmd_builder; buffer_init(&cmd_builder); if(!monitor_path) fatal("Monitor path should be specified."); buffer_printf(&cmd_builder, "%s", monitor_path); buffer_printf(&cmd_builder, " --with-output-files=%s", template_filename); if(debug_output) buffer_printf(&cmd_builder, " -dall -o %s.debug", template_filename); if(time_series) buffer_printf(&cmd_builder, " --with-time-series"); if(inotify_stats) buffer_printf(&cmd_builder, " --with-inotify"); if(limits) { if(limits->end > -1) buffer_printf(&cmd_builder, " -L 'end: %lf'", limits->end/1000000e0); if(limits->wall_time > -1) buffer_printf(&cmd_builder, " -L 'wall_time: %lf'", limits->wall_time/1000000e0); if(limits->cpu_time > -1) buffer_printf(&cmd_builder, " -L 'cpu_time: %lf'", limits->cpu_time/1000000e0); if(limits->cores > -1) buffer_printf(&cmd_builder, " -L 'cores: %" PRId64 "'", limits->cores); if(limits->max_concurrent_processes > -1) buffer_printf(&cmd_builder, " -L 'max_concurrent_processes: %" PRId64 "'", limits->max_concurrent_processes); if(limits->total_processes > -1) buffer_printf(&cmd_builder, " -L 'total_processes: %" PRId64 "'", limits->total_processes); if(limits->virtual_memory > -1) buffer_printf(&cmd_builder, " -L 'virtual_memory: %" PRId64 "'", limits->virtual_memory); if(limits->memory > -1) buffer_printf(&cmd_builder, " -L 'memory: %" PRId64 "'", limits->memory); if(limits->swap_memory > -1) buffer_printf(&cmd_builder, " -L 'swap_memory: %" PRId64 "'", limits->swap_memory); if(limits->bytes_read > -1) buffer_printf(&cmd_builder, " -L 'bytes_read: %" PRId64 "'", limits->bytes_read); if(limits->bytes_written > -1) buffer_printf(&cmd_builder, " -L 'bytes_written: %" PRId64 "'", limits->bytes_written); if(limits->total_files > -1) buffer_printf(&cmd_builder, " -L 'total_files: %" PRId64 "'", limits->total_files); if(limits->disk > -1) buffer_printf(&cmd_builder, " -L 'disk: %" PRId64 "'", limits->disk); } if(extra_monitor_options) buffer_printf(&cmd_builder, " %s", extra_monitor_options); buffer_printf(&cmd_builder, " --sh []"); char *result; buffer_dupl(&cmd_builder, &result, 0); buffer_free(&cmd_builder); return result; }