/* SlideScript - minimalistic top-down scripting language. (C) Copyright 2014-2021 Chris Dorman - some rights reserved (GPLv2) View README file supplied with this software for more details */ #include "inc/deps.h" #include "inc/lexer.h" #include "inc/util.h" #include "inc/vars.h" #include "inc/enc.h" #include "inc/math.h" #include "inc/md5.h" #include "inc/network.h" #include "inc/search.h" #include "inc/inset.h" // For slidescript compression algorithm #include "inc/tar.h" #include "inc/compression.h" char *process_line(char *line) { char *tok_srch; //printf("%s", &line[strlen(line)-2]); static char concatbuf[MAX_CONCAT_BUF+1]; static char filebuf[MAX_READFILE_LEN+1]; static char retbuf[MAX_STRING_BUFSIZE]; static char compbuf[MAX_STRING_BUFSIZE]; static char loopbuf[MAX_STRING_BUFSIZE]; static char countbuf[MAX_STRING_BUFSIZE]; // Make sure static buffers are empty before initialize // Write with zeros bzero(filebuf, MAX_READFILE_LEN); bzero(concatbuf, MAX_CONCAT_BUF); bzero(retbuf, MAX_STRING_LEN); tok_srch = strtok(line, "=\" ;"); /* reuse function */ /*else if(strncmp("temp",tok_srch,4) == 0) { tok_srch = strtok(NULL, " "); }*/ /* if line starts with a comment, skip */ if(strncmp("#",tok_srch,1) == 0) { return NULL; } // Check for main calls from user in interactive else if(strncmp("exit", tok_srch, 4) == 0) syn_error("ss:exit called"); else if(strncmp("version", tok_srch, 7) == 0) printf("ss:version: %s, type 'help' for function list\n", VERSION); else if(strncmp("help", tok_srch, 4) == 0) printf("ss:help:\n%s", FUNCTION_HELP); // Lets add if and loop statements, make this // Somewhat usable as a language in other instances // Loop else if(strncmp("loop:", tok_srch, 4) == 0) { int loop_count, ii; char *proc_return; if(loopbuf != NULL || countbuf != NULL) { bzero(loopbuf, MAX_STRING_LEN); bzero(countbuf, MAX_STRING_LEN); } *loopbuf = '\0'; // We have an if statement tok_srch = strtok(NULL, ";"); if(tok_srch == NULL) { syn_warn("ss:warn:loop statement requires arguments"); return NULL; } strcat(countbuf, parse_vars(tok_srch)); loop_count = atoi(countbuf); tok_srch = strtok(NULL, ";"); if(tok_srch == NULL) { syn_warn("ss:warn:loop syntax error, missing last argument?"); return NULL; } strcat(loopbuf, parse_vars(tok_srch)); for(ii = 0; ii < loop_count; ii++) { proc_return = process_line(parse_vars(loopbuf)); printf("%s\n", proc_return); } return NULL; } // IF statement else if(strncmp("comp:", tok_srch, 5) == 0) { if(compbuf != NULL) { bzero(compbuf, MAX_STRING_LEN); } // We have an if statement tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:if statement requires arguments"); return NULL; } // Check if there's anything after the first quote if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:if syntax error, missing first argument?"); return NULL; } // Make sure the end quote exists if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:if syntax error, missing quote?"); return NULL; } if(strlen(tok_srch) < MAX_STRING_LEN) { strcpy(compbuf, parse_vars(tok_srch)); } else { syn_warn("ss:warn:if, return exceeds compare buffer"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:if statement requires two compared arguments"); return NULL; } // Check if there's anything after the first quote if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:if syntax error, missing second argument?"); return NULL; } // Make sure the end quote exists if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:if syntax error, missing end quote?"); return NULL; } if(atoi(compbuf) == atoi(parse_vars(tok_srch))) { return "true"; } else { return "false"; } } // Change directory else if(strncmp("backdir", tok_srch, 7) == 0) { int chdir_return = chdir(".."); if(chdir_return < 0) { syn_warn("ss:warn:backdir, failed to move directory location"); } } // Move files using rename() else if(strncmp("move",tok_srch,4) == 0 || strncmp("mv", tok_srch, 2) == 0) { char orig_fn[MAX_STRING_BUFSIZE]; // Should never be more than 6 characters tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:move syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:move syntax error, missing filename?"); return NULL; } if(strlen(parse_vars(tok_srch)) < MAX_STRING_LEN) { strcpy(orig_fn, parse_vars(tok_srch)); } else { syn_warn("ss:warn:move syntax error, missing first filename?"); return NULL; } /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:move syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:move syntax error, missing second filename?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:move syntax error, missing quote?"); return NULL; } int rename_return = rename(orig_fn, parse_vars(tok_srch)); if(rename_return < 0) { syn_warn("ss:warn:move, failed to move file"); } return NULL; } // Show current directory. else if(strncmp("showpath", tok_srch, 8) == 0 || strncmp("pwd", tok_srch, 3) == 0) { // Get current directory, if it errors, return NULL if (getcwd(retbuf, sizeof(retbuf)) == NULL) { return NULL; } // All good, return path return retbuf; } // Change directory else if(strncmp("chdir", tok_srch, 5) == 0 || strncmp("cd", tok_srch, 2) == 0) { char *dirname; int chdir_return; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:chdir syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:chdir syntax error, missing end quote?"); return NULL; } dirname = parse_vars(tok_srch); chdir_return = chdir(dirname); if(chdir_return < 0) { syn_warn("ss:warn:chdir, error changing directory"); } return NULL; } else if(strncmp("showdir", tok_srch, 7) == 0 || strncmp("ls", tok_srch, 2) == 0) { char *dirname; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { dirname = "."; } if(strtok(NULL, "\"")==NULL && dirname == NULL) { syn_warn("ss:warn:showdir syntax error, missing end quote?"); return NULL; } if(dirname == NULL) dirname = parse_vars(tok_srch); sprintf(retbuf, "%s\n", "ss:showdir:"); struct dirent **files; int nn; nn = scandir (dirname, &files, NULL, alphasort); if (nn < 0) { syn_warn("ss:warn:showdir, failed to open directory"); return NULL; } for (int ii = 0; ii < nn; ii++) { struct dirent *ent = files [ii]; if((strlen(retbuf) + strlen(ent->d_name) + 1) < MAX_STRING_LEN) { strcat(retbuf, ent->d_name); strcat(retbuf, "\n"); } } for (int ii = 0; ii < nn; ii++) { free (files [ii]); } free (files); return retbuf; } /* COMPRESSION AND DECOMPRESSION */ else if(strncmp("decompress",tok_srch,10) == 0) { char *filename; struct tar_t *archive = (void *)0; int fd; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:decompress syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:decompress syntax error, missing end quote?"); return NULL; } filename = parse_vars(tok_srch); FILE *in; char origsize[128]; char filedecout[MAX_FILENAME_LEN+5]; in = fopen(filename, "rb"); if(in == NULL) { syn_warn("ss:warn:compress, failed to open tar for compression"); return NULL; } sprintf(filedecout, "uncompressed.tar"); sprintf(origsize, "%ld", fsize(in)); uint32_t deco_return = ss_decompress(filename, filedecout); sprintf(retbuf, "ss: %s: decompressed: %s -> %u", filename, origsize, deco_return); fclose(in); // open existing file if ((fd = open(filedecout, O_RDWR)) < 0) { syn_warn("ss:warn:decompress, failed to tar open archive"); return NULL; } // read in data if (tar_read(fd, &archive, '1') < 0) { close(fd); syn_warn("ss:warn:decompress, failed to read archive"); return NULL; } // perform operation if(tar_extract(fd, archive, 0, NULL, '1') < 0) { // extract entries syn_warn("ss:warn:decompress, error occured"); return NULL; } usleep(50); if(archive != (void *)0) { tar_free(archive); archive = (void *)0; } close(fd); // don't bother checking for fd < 0 remove(filedecout); return retbuf; } /* Compression function of tar */ else if(strncmp("compress",tok_srch,8) == 0) { char filename[MAX_FILENAME_LEN+1]; // Files to be added into the archive char comp_size[128]; struct tar_t *archive = (void *)0; int fd; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:compress syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:compress syntax error, missing archive name..."); return NULL; } // Save tarball filename if(strlen(parse_vars(tok_srch)) < MAX_FILENAME_LEN) { sprintf(filename, "%s", parse_vars(tok_srch)); } else { syn_warn("ss:warn:compress, filename too long!"); return NULL; } if ((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) == -1){ syn_warn("ss:warn:compress, failed to open new archive"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:compress syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:compress syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:compress, missing file path (what are we gonna compress?)"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:compress syntax error, missing end quote?"); return NULL; } int argc = 0; char *argv[MAX_FILES]; char *p2 = strtok(tok_srch, " "); while (p2 && argc < MAX_FILES-1) { argv[argc++] = p2; p2 = strtok(NULL, " "); } argv[argc] = 0; const char **tarin = (const char **) &argv[0]; if (tar_write(fd, &archive, argc, tarin, '1') < 0) { syn_warn("ss:warn:compress, failed to create tar archive"); return NULL; } if(archive != (void *)0) { tar_free(archive); archive = (void *)0; } close(fd); // don't bother checking for fd < 0 FILE *in; char origsize[128]; char file_comp[MAX_FILENAME_LEN+9]; char filedecout[MAX_FILENAME_LEN+10]; in = fopen(filename, "rb"); if(in == NULL) { syn_warn("ss:warn:compress, failed to open tar for compression"); return NULL; } sprintf(file_comp, "%s.tar.ss", filename); sprintf(filedecout, "%s.tar.1", filename); sprintf(origsize, "%ld", fsize(in)); sprintf(comp_size, "%s", origsize); fclose(in); for(uint32_t i = 1; i < 7; ++i) { uint32_t comp_return = ss_compress(filename, file_comp, i); uint32_t deco_return = ss_decompress(file_comp, filedecout); sprintf(retbuf, "ss: %s: compressed: %u -> %u", file_comp, deco_return, comp_return); if(atoi(comp_size) < (int)comp_return && comp_return != 0 && deco_return != 0 && i != 1) break; sprintf(comp_size, "%u", comp_return); printf("pass %u decompressed/compressed: %u/%u\n", i, deco_return, comp_return); } // Remove the decompressed version for sanity check remove(filedecout); remove(filename); return retbuf; } /* mkdir function, and mkfile functions */ else if(strncmp("mkdir",tok_srch,5) == 0) { int parsed; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:mkdir syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:mkdir syntax error, missing end quote?"); return NULL; } parsed = file_exists(parse_vars(tok_srch)); if(parsed == 1) { syn_warn("ss:warn:mkdir, file exists"); return NULL; } // Create directory if need pe int mkpret = mkpath(parse_vars(tok_srch), 0755); if(mkpret == -1) syn_warn("ss:warn:mkdir, failed to make directory"); return NULL; } else if(strncmp("mkfile",tok_srch,5) == 0) { int parsed; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:mkfile syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:mkfile syntax error, missing end quote?"); return NULL; } parsed = file_exists(parse_vars(tok_srch)); if(parsed == 1) { syn_warn("ss:warn:mkfile, file exists"); return NULL; } // Create directory if need pe int mkpret = mkpath(parse_vars(tok_srch), 0755); if(mkpret == -1) syn_warn("ss:warn:mkfile, failed to form parent path, attempting to write file."); FILE *cfile = fopen(parse_vars(tok_srch), "w"); if(cfile == NULL) { syn_warn("ss:warn:mkfile, failed to open file"); return NULL; } fprintf(cfile, "%d", '\0'); fclose(cfile); return NULL; } /* time function */ else if(strncmp("time",tok_srch,4) == 0) { char *parsed; parsed = ss_time(); return strip_nl(parsed); } /* isfile function */ else if(strncmp("isfile",tok_srch,5) == 0) { int parsed; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:isfile syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:isfile syntax error, missing end quote?"); return NULL; } parsed = file_exists(parse_vars(tok_srch)); if(parsed == 1) { return "1"; } else { return "0"; } } /* isdir function */ else if(strncmp("isdir",tok_srch,5) == 0) { int parsed; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:isdir syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"")==NULL) { syn_warn("ss:warn:isdir syntax error, missing end quote?"); return NULL; } parsed = is_dir(parse_vars(tok_srch)); if(parsed < 1) { return "0"; } else { return "1"; } } /* print function */ else if(strncmp("print",tok_srch,5) == 0) { char *parsed; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:print syntax error, missing quote?"); return NULL; } parsed = parse_vars(tok_srch); if(parsed != NULL) { if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:print syntax error, missing end quote?"); return NULL; } return parsed; } else { syn_warn("ss:warn:print compulation error, no argument?"); return NULL; } } /* sleep function */ else if(strncmp("sleep",tok_srch,5) == 0) { tok_srch = strtok(NULL, " "); if(tok_srch == NULL) { syn_warn("ss:warn:sleep syntax error, need trailing integer for operation"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:sleep syntax error, need trailing integer for operation"); return NULL; } /* if there is a new line, remove it */ if(tok_srch[strlen(tok_srch)-1] == '\n') { tok_srch[strlen(tok_srch)-1] = 0; } sleep(atoi(parse_vars(tok_srch))); return NULL; } // Calc function, some math involved! // else if(strncmp("calc",tok_srch,5) == 0) { char *expr_return; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:calc syntax error, missing quotes around equation"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || (strcmp(tok_srch, " \n") == 0)) { syn_warn("ss:warn:calc syntax error, missing equation?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:calc syntax error, missing ending quote?"); return NULL; } expr_return = ss_expr(parse_vars(tok_srch)); return expr_return; } /* Networking, listen */ else if(strncmp("netlisten",tok_srch,9) == 0) { char srch[MAX_NETSRCH_BUF]; char port[7]; // Should never be more than 6 characters tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:netlisten syntax error, missing beginning quote"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:netlisten syntax error, missing address?"); return NULL; } if(strlen(parse_vars(tok_srch)) < 7) { strcpy(port, parse_vars(tok_srch)); } else { syn_warn("ss:warn:netlisten syntax error, port too long?"); return NULL; } /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:netlisten syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:netlisten syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:netlisten syntax error, missing search string?"); return NULL; } strcpy(srch, parse_vars(tok_srch)); /* strtok to the socket response */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:netlisten syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:netlisten syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:netlisten syntax error, missing return string?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:netlisten syntax error, missing end quote?"); return NULL; } snet_listen(atoi(port), srch, parse_vars(tok_srch)); return NULL; } /* Networking, listen */ else if(strncmp("nethttp",tok_srch,7) == 0) { char port[7]; // Should never be more than 6 characters tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nethttp syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:nethttp syntax error, missing port value?"); return NULL; } if(strlen(parse_vars(tok_srch)) < 7) { strcpy(port, parse_vars(tok_srch)); } else { syn_warn("ss:warn:nethttp syntax error, missing quote?"); return NULL; } /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nethttp syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:nethttp syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:nethttp syntax error, missing quote?"); return NULL; } if(atoi(parse_vars(tok_srch)) == 1 || atoi(parse_vars(tok_srch)) == 0) { snet_http(atoi(port), atoi(parse_vars(tok_srch))); } else { syn_warn("ss:warn:nethttp syntax error, fork = 1, not 0"); return NULL; } return NULL; } /* Networking, connect */ else if(strncmp("nettoss",tok_srch,10) == 0) { char address[MAX_ADDRESS_BUF]; char data[MAX_STRING_BUFSIZE]; char port[7]; /* strtok to filename of function */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nettoss syntax error, missing quote?"); return NULL; } /* Check to see if syntax is correct */ if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:nettoss syntax error, missig address?"); return NULL; } /* open file */ strcpy(address, parse_vars(tok_srch)); /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nettoss syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:nettoss syntax error, missing quote?"); return NULL; } if(strlen(parse_vars(tok_srch)) > 6) { syn_warn("ss:warn:nettoss syntax error, port too long"); return NULL; } strcpy(port, parse_vars(tok_srch)); tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nettoss syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:nettoss syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:nettoss syntax error, send string"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:nettoss syntax error, missing end quote?"); return NULL; } strcpy(data, parse_vars(tok_srch)); snet_toss(address, atoi(port), data); return NULL; } /* ss encrypt function */ else if(strncmp("encode", tok_srch,6) == 0) { char *var_conv; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:encode syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:encode syntax error, encode string?"); return NULL; } var_conv = parse_vars(tok_srch); if(var_conv != NULL) { char *encrp; encrp = ss_encrypt(var_conv); return encrp; } else { syn_warn("ss:warn:encode returned NULL!"); return NULL; } } /* ss decrypt function */ else if(strncmp("decode", tok_srch,6) == 0) { char *var_conv; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:decode syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:decode syntax error, missing decode data?"); return NULL; } var_conv = parse_vars(tok_srch); if(var_conv != NULL) { char *decrp; decrp = ss_decrypt(var_conv); return decrp; } else { syn_warn("ss:warn:decode returned NULL!"); return NULL; } } /* builtin md5 function */ else if(strncmp("md5",tok_srch,3) == 0) { char *file_line, *catfile, *file_md5_val; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:md5 syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:md5 syntax error, need filename"); return NULL; } file_line = parse_vars(tok_srch); file_md5_val = md5_file(file_line); catfile = ss_concat(file_md5_val, file_line); if(strlen(catfile) < MAX_CONCAT_BUF) { strcpy(concatbuf, catfile); free(catfile); return concatbuf; } else { free(catfile); syn_warn("ss:warn:md5 returned NULL!"); return NULL; } } /* system execute function */ else if(strncmp("exec", tok_srch, 4) == 0 || strncmp("~", tok_srch, 1) == 0) { char *cmd_line; int return_val; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:exec syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:exec syntax error, missing execution switch?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:exec syntax error, missing quote?"); return NULL; } cmd_line = parse_vars(tok_srch); return_val = system(cmd_line); if(return_val != 0) syn_warn("ss:warn:exec returned error code"); return NULL; } else if(strncmp("search",tok_srch,6) == 0) { char filename[MAX_FILENAME_BUFSIZE]; char *search_str, *retval; FILE* search_file = NULL; /* strtok to filename of function */ bzero(filename, MAX_FILENAME_LEN); tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:search syntax error, missing quote?"); return NULL; } /* Check to see if syntax is correct */ if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:search syntax error, missing filename"); return NULL; } /* open file */ if(MAX_FILENAME_LEN < atoi(parse_vars(tok_srch))) { syn_warn("ss:warn:search, filename too long"); return NULL; } strcat(filename, parse_vars(tok_srch)); search_file = fopen(filename, "r"); /* Check if file exists and can be opened */ if(search_file == NULL) { syn_warn("ss:warn:search, failed to open file"); return NULL; } /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(search_file); syn_warn("ss:warn:search syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(search_file); syn_warn("ss:warn:search syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { fclose(search_file); syn_warn("ss:warn:search syntax error, missing write data?"); return NULL; } if(strtok(NULL, "\"") == NULL) { fclose(search_file); syn_warn("ss:warn:search syntax error, missing end quote?"); return NULL; } search_str = parse_vars(tok_srch); retval = strip_nl(ss_search(filename, search_file, search_str)); fclose(search_file); return retval; } /* search function */ /* write */ else if(strncmp("write",tok_srch,5) == 0) { char *filename; char *file_content; FILE* write_file = NULL; /* strtok to filename of function */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } /* Check to see if syntax is correct */ if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:write syntax error, missing filename"); return NULL; } /* open file */ filename = parse_vars(tok_srch); write_file = fopen(filename, "w"); /* Check if file exists and can be opened */ if(write_file == NULL) { syn_warn("ss:warn:write, failed to open file"); return NULL; } /* strtok to the content that will be written to file */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(write_file); syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(write_file); syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { fclose(write_file); syn_warn("ss:warn:write syntax error, missing write data?"); return NULL; } if(strtok(NULL, "\"") == NULL) { fclose(write_file); syn_warn("ss:warn:write syntax error, missing end quote?"); return NULL; } file_content = parse_vars(tok_srch); fprintf(write_file, "%s\n", file_content); fclose(write_file); return NULL; } /* write function */ /* read function */ else if(strncmp("read",tok_srch,4) == 0) { unsigned long read_size; char read_line[1024]; char *filename, *dynfile; FILE *read_file = NULL; /* strtok to filename of function */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:write syntax error, missing quote?"); return NULL; } /* Pull any variables out of the file name that may be, and BAM, variable fill! */ filename = parse_vars(tok_srch); // WERE LOADING FILES INTO MEMORY NOW! /* open file */ read_file = fopen(filename, "r"); fseek(read_file, 0L, SEEK_END); read_size = ftell(read_file); rewind(read_file); dynfile = (char *)malloc(read_size + 1); *dynfile = '\0'; /* Check if file was opened successfully */ if(read_file == NULL) { free(dynfile); syn_warn("ss:warn:write, failed open"); return NULL; } while(fgets(read_line, sizeof(read_line), read_file) != NULL) { strcat(dynfile, read_line); } if(read_size <= MAX_READFILE_LEN) { // Copy string to end of file, rewrite file sprintf(filebuf, "%s", dynfile); free(dynfile); } else { free(dynfile); fclose(read_file); syn_warn("ss:warn:write, file too large (2MB max)"); return NULL; } fclose(read_file); return strip_nl(filebuf); } /* read function */ /* Cat function, writes to end of file specified */ else if(strncmp("cat",tok_srch,3) == 0) { unsigned long read_size; char read_line[1024]; char filename[2048+1], *dynfile; FILE *read_file = NULL; /* strtok to filename of function */ tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:cat syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:cat syntax error, missing filename?"); return NULL; } if(strlen(parse_vars(tok_srch)) < 2048) { strcpy(filename, parse_vars(tok_srch)); } else { syn_warn("ss:warn:cat, filename too long"); return NULL; } // WERE LOADING FILES INTO MEMORY NOW! /* open file */ read_file = fopen(filename, "r"); /* strtok to the content that will be written to file */ if(read_file == NULL) { syn_warn("ss:warn:cat, failed to open file"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(read_file); syn_warn("ss:warn:cat syntax error, missing quote?"); return NULL; } tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { fclose(read_file); syn_warn("ss:warn:cat syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { fclose(read_file); syn_warn("ss:warn:cat syntax error, missing write data?"); return NULL; } if(strtok(NULL, "\"") == NULL) { fclose(read_file); syn_warn("ss:warn:cat syntax error, missing end quote?"); return NULL; } fseek(read_file, 0L, SEEK_END); read_size = ftell(read_file); rewind(read_file); dynfile = (char *)malloc(read_size + 1); *dynfile = '\0'; while(fgets(read_line, sizeof(read_line), read_file) != NULL) { strcat(dynfile, read_line); } fclose(read_file); if((read_size + strlen(parse_vars(tok_srch))) <= MAX_READFILE_LEN) { read_file = fopen(filename, "w"); sprintf(filebuf, "%s%s", dynfile, parse_vars(tok_srch)); fprintf(read_file, "%s", filebuf); free(dynfile); fclose(read_file); } else { free(dynfile); fclose(read_file); syn_warn("ss:warn:cat, file too large (2MB max)"); return NULL; } return NULL; } /* cat function */ else if(strncmp("delete", tok_srch, 6) == 0) { char *del_filename; tok_srch = strtok(NULL, "\""); if(tok_srch == NULL) { syn_warn("ss:warn:delete syntax error, missing quote?"); return NULL; } if(strcmp(tok_srch, "\n") == 0 || strcmp(tok_srch, " \n") == 0) { syn_warn("ss:warn:delete syntax error, missing filename"); return NULL; } if(strtok(NULL, "\"") == NULL) { syn_warn("ss:warn:delete syntax error, missing quote?"); return NULL; } /* Pull variables out of filename if any */ del_filename = parse_vars(tok_srch); if(access(del_filename, F_OK) == 0) { if(access(del_filename, W_OK) == 0) { remove(del_filename); return NULL; } else { syn_warn("ss:warn:delete, file not accessible"); return NULL; } } else { syn_warn("ss:warn:delete, file not found"); return NULL; } } else if(strcmp(tok_srch, "\n") != 0 && strcmp(tok_srch, "") != 0) { if(tok_srch[strlen(tok_srch)-1] == '\n') { return NULL; } else { int varc = get_var_count(); char *varname_tmp = tok_srch; char *bq_check; tok_srch = strtok(NULL, "="); // Check for back quotes, return string with backquotes processed bq_check = strip_nl(parse_bq(parse_vars(tok_srch))); // Don't check if variable is blank, if so let it fly! set_var(varc, varname_tmp, bq_check); /* printf("ss: var '%s' -> %s", varname_tmp, get_var_data(varname_tmp)); */ } } return NULL; }