summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2014-10-24 14:27:55 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2014-10-24 14:27:55 +0000
commit0ed18258e2fa760eae780fee741bb95eeb467bc4 (patch)
tree1b15ed4f440e0b9cd8bfc30ef53b43778d85d6a5 /scripts
parent8036c2ddfdbf9f6b35ea76244b98a10b1d76c55b (diff)
parent8b37ecabaa5cb30c55f6ea2492d1e0ac3f612748 (diff)
downloadmorph-0ed18258e2fa760eae780fee741bb95eeb467bc4.tar.gz
Merge branch 'baserock/richardmaw/test-system-integrations'
Reviewed-by: Sam Thursfield Reviewed-by: Pedro Alvarez Reviewed-by: Daniel Silverstone
Diffstat (limited to 'scripts')
-rw-r--r--scripts/test-shell.c91
1 files changed, 60 insertions, 31 deletions
diff --git a/scripts/test-shell.c b/scripts/test-shell.c
index e3ef1ff1..2f8ecbd8 100644
--- a/scripts/test-shell.c
+++ b/scripts/test-shell.c
@@ -107,44 +107,73 @@ cleanup:
return ret;
}
-int main(int argc, char *argv[]) {
+int copy_file_objects(FILE *source, FILE *target) {
+ char buffer[BUFSIZ];
+ size_t read;
+ do {
+ read = fread(buffer, 1, sizeof(buffer), source);
+ fwrite(buffer, 1, read, target);
+ } while (!feof(source));
+ return ferror(source) ? -1 : 0;
+}
+
+int run_commands(FILE *cmdstream){
int ret = 1;
- if (argc != 3 || strcmp(argv[1], "-c") != 0) {
- fprintf(stderr, "Usage: %s -c COMMAND\n", argv[0]);
- return 1;
- }
- size_t cmdlen = strlen(argv[2]);
- FILE *cmdstream = fmemopen(argv[2], cmdlen, "r");
- {
- ssize_t read;
- size_t len = 0;
- char *line = NULL;
+ ssize_t read;
+ size_t len = 0;
+ char *line = NULL;
- ret = 0;
- while ((read = getline(&line, &len, cmdstream)) != -1) {
- if (line[read - 1] == '\n') line[read - 1] = '\0';
- if (strcmp(line, "copy files") == 0) {
- /* Recursively copy contents of current dir to DESTDIR */
- if (nftw(".", copy_entry, 20, FTW_PHYS)) {
- ret = 1;
- break;
- }
- } else if (strcmp(line, "false") == 0 ||
- strstr(line, "false ") == line) {
+ ret = 0;
+ while ((read = getline(&line, &len, cmdstream)) != -1) {
+ if (line[read - 1] == '\n') line[read - 1] = '\0';
+ if (strcmp(line, "copy files") == 0) {
+ /* Recursively copy contents of current dir to DESTDIR */
+ if (nftw(".", copy_entry, 20, FTW_PHYS)) {
ret = 1;
break;
- } else if (strstr(line, "echo ") == line) {
- if (puts(line + sizeof("echo ") - 1) == EOF){
- perror("echo");
- ret = 1;
- break;
- }
- } else {
- ret = 127;
+ }
+ } else if (strcmp(line, "false") == 0 ||
+ strstr(line, "false ") == line) {
+ ret = 1;
+ break;
+ } else if (strstr(line, "echo ") == line) {
+ if (puts(line + sizeof("echo ") - 1) == EOF){
+ perror("echo");
+ ret = 1;
break;
}
+ } else if (strstr(line, "create file ") == line) {
+ char const *filename = line + sizeof("create file ") -1;
+ FILE *outfile = fopen(filename, "w");
+ if (copy_file_objects(cmdstream, outfile) < 0) {
+ ret = 1;
+ fclose(outfile);
+ break;
+ }
+ fclose(outfile);
+ } else if (line[0] == '#' || strstr(line, "set ") == line) {
+ /* Comments and set commands are ignored */
+ continue;
+ } else {
+ fprintf(stderr, "Unrecognized command: %s\n", line);
+ ret = 127;
+ break;
}
- free(line);
}
+ free(line);
return ret;
}
+
+int main(int argc, char *argv[]) {
+ if (argc == 3 && strcmp(argv[1], "-c") == 0) {
+ size_t cmdlen = strlen(argv[2]);
+ FILE *cmdstream = fmemopen(argv[2], cmdlen, "r");
+ return run_commands(cmdstream);
+ } else if (argc == 2) {
+ FILE *cmdstream = fopen(argv[1], "r");
+ return run_commands(cmdstream);
+ } else {
+ fprintf(stderr, "Usage: %s -c COMMAND|%s SCRIPT\n", argv[0], argv[0]);
+ return 1;
+ }
+}