/*
Copyright (C) 2016-2019 The University of Notre Dame
This software is distributed under the GNU General Public License.
See the file LICENSE for details.
*/

#include "library/syscalls.h"
#include "kernel/syscall.h"
#include "kernel/stats.h"
#include "library/string.h"
#include "library/errno.h"

int main(int argc, const char *argv[])
{
	if (argc <= 1) {
		printf("No program to run\n");
		return 1;
	}
	unsigned int startTime;
	syscall_system_time(&startTime);

	int pid;
	int fd = syscall_open_file(KNO_STDDIR,argv[1],0,0);
	if(fd>=0) {
		pid = syscall_process_fork();
		if (pid == 0) { // child
			syscall_process_exec(fd, argc-1, &argv[1]);
			printf("exec failed\n");
			return 1;
		} else if (pid < 0) {
			printf("fork failed\n");
			return -1;
		}
	} else {
		printf("couldn't find %s: %s\n",argv[1],strerror(fd));
		return 1;
	}

	/* parent */
	struct process_info info;
	syscall_process_wait(&info, -1);
	unsigned int timeElapsed;
	syscall_system_time(&timeElapsed);
	timeElapsed -= startTime;
	struct process_stats stat;
	syscall_process_stats(&stat, pid);
	printf("Process %u exited with status %d\n", info.pid, info.exitcode);
	printf("Time elapsed: %d:%d:%d\n", timeElapsed/3600, (timeElapsed%3600)/60, timeElapsed % 60);
	printf("%d blocks read, %d blocks written\n", stat.blocks_read, stat.blocks_written);
	printf("%d bytes read, %d bytes written\n", stat.bytes_read, stat.bytes_written);

	printf("System calls used:\n");
	for (int i = 0; i < MAX_SYSCALL; i++) {
		if (stat.syscall_count[i]) {
			printf("Syscall %d: %u\n", i, stat.syscall_count[i]);
		}
	}



	return 0;
}
