inline void include_(char *line, char *var_head, FILE *out) //SSI made total brutal, no checks of file path, and include must be along in string of file! { char *var_head2; struct parsestr strct; do{ if ((var_head2 = parsestr2(&strct, var_head,"par=\"/[/*/]\"/ "))!=NULL){ //<!--#include par="size:web_name:name:pattern" --> /*collect parameters in a array*/ char *a, *ptr; int i = 0, str_size, val_size; struct cfg_parse1 *cfg_pointer; *cfg_p = (struct cfg_parse1 *)malloc(sizeof(struct cfg_parse1)); cfg_pointer = *cfg_p; if(cfg_pointer == NULL) continue; ptr = var_head2; while(i < 3){ a = w_strtok(&ptr, ':'); if(a) switch(i){ case 0: val_size = atoi(a); if(!val_size || val_size > 300) return; //size is in impassable range - so skip it all (whole parameter string will be skipped!) a = ptr; str_size = strlen(a)+1; ptr = (char*)malloc(str_size + 2*val_size);//str = "[part of var_head2][value][new_value]" if(ptr == NULL){ i = 5; continue; } strcpy(ptr, a); cfg_pointer->type = CFG_PAR; cfg_pointer->str = ptr; cfg_pointer->size = val_size; cfg_pointer->changed = 0; cfg_pointer->saved = 0; cfg_pointer->value = ptr + str_size; // *(cfg_pointer->value) = '\0'; cfg_pointer->new_value = ptr + str_size + val_size; // *(cfg_pointer->new_value) = '\0'; memset(cfg_pointer->value, 0, 2*val_size);//fill with zeros cfg_pointer->name = NULL; cfg_pointer->pattern = NULL; cfg_pointer->web_name = NULL; cfg_pointer->next = NULL; break; case 1: cfg_pointer->web_name = a; break; case 2: cfg_pointer->name = a; cfg_pointer->pattern = ptr; break; } else { printf("par=\"\" not full, broken by %d\n", i+1); break; } i++; } if(i != 5){ printf("Collected parameter: %s:%s:%lld:%s\n", cfg_pointer->web_name, cfg_pointer->name, cfg_pointer->size, cfg_pointer->pattern); cfg_p = &(cfg_pointer->next); }else{ printf("ERROR allocate memory\n"); if(cfg_p && *cfg_p){ free(*cfg_p); *cfg_p = NULL; //main criteria to abort moving in array. } } } else if ((var_head2 = parsestr2(&strct, var_head,"readcfg/ "))!=NULL){ //<!--#include readcfg --> /*start to fill parameters from config to collected array*/ ReadConfiguration(); } else if ((var_head2 = parsestr2(&strct, var_head,"area=\"/[/*/]\"/ "))!=NULL){ //<!--#include area="size:web_name" --> /*collect parameters in a array*/ char *a, *ptr; int i = 0, str_size; long long val_size; struct cfg_parse1 *cfg_pointer; *cfg_p = (struct cfg_parse1 *)malloc(sizeof(struct cfg_parse1)); cfg_pointer = *cfg_p; if(cfg_pointer == NULL) continue; ptr = var_head2; while(i < 2){ a = w_strtok(&ptr, ':'); if(a) switch(i){ case 0: val_size = atoll(a); if(val_size > 32 *1024) return; //size is in impassable range - so skip it all (whole parameter string will be skipped!) a = ptr; str_size = strlen(a)+1; ptr = (char*)malloc(str_size + val_size);//str = "[part of var_head2][value]" if(ptr == NULL){ i = 5; continue; } strcpy(ptr, a); cfg_pointer->type = (val_size != 0) ? CFG_AREA : CFG_TMP; cfg_pointer->str = ptr; cfg_pointer->size = val_size; cfg_pointer->changed = 0; cfg_pointer->saved = 0; if(val_size != 0){//AREA="size:name" cfg_pointer->value = ptr + str_size; cfg_pointer->new_value = ptr + str_size; memset(cfg_pointer->value, 0, val_size);//fill memory with 0 }else{//AREA="0:temp_name" cfg_pointer->value = NULL; cfg_pointer->new_value = NULL; } cfg_pointer->name = NULL; //ptr + str_size - 1; cfg_pointer->pattern = NULL; //ptr + str_size - 1; cfg_pointer->web_name = NULL; cfg_pointer->next = NULL; break; case 1: cfg_pointer->web_name = a; break; } else { printf("area=\"\" not full, broken by %d\n", i+1); break; } i++; } if(i != 5){ printf("Collected parameter: [%s:%lld]\n", cfg_pointer->web_name, cfg_pointer->size); cfg_p = &(cfg_pointer->next); }else{ printf("ERROR allocate memory\n"); if(cfg_p && *cfg_p){ free(*cfg_p); *cfg_p = NULL; //main criteria to abort moving in array. } } } else //printf("include file: %s\n", var_head); if ((var_head2 = parsestr2(&strct, var_head,"file=\"/[/*/N\\N/]\"/ "))!=NULL){ //<!--#include file="..\".." --> //printf("include file: %s\n", var_head2); copy_file_include(var_head2, out); } else if ((var_head2 = parsestr2(&strct, var_head,"exec=\"/[/*/]\"/ "))!=NULL){ //<!--#include exec="..." --> my_system(out, var_head2); } else if ((var_head2 = parsestr2(&strct, var_head,"shell=\"\"/[/*/]\"\"/ "))!=NULL){ //<!--#include shell=""..."" --> my_shell(out, var_head2); } else if ((var_head2 = parsestr2(&strct, var_head,"cgi=\"/[/*/]\"/ "))!=NULL){ //<!--#include cgi="..." --> if(DoCGI(out, var_head2)) fprintf(out, "Not Found: %s\n", var_head2);// what about arg?? else free_par_tmp();//clear all "temp"-parameters } else if((var_head2 = parsestr2(&strct, var_head, "tbl_select=\"/[/*/]\"/ "))!=NULL){ show_tbl(var_head2, out); } else if((var_head2 = parsestr2(&strct, var_head, "tbl_check=\"/[/*/]\"/ "))!=NULL){ show_tbl_chck(var_head2, out); } else if((var_head2 = parsestr2(&strct, var_head, "chtbl_stat=\"/[/*/]\"/ "))!=NULL){ change_tbl_stat(var_head2); } else if((var_head2 = parsestr2(&strct, var_head, "InIt/ "))!=NULL){ //<!--#include InIt --> ReadConfiguration(); } else if((var_head2 = parsestr2(&strct, var_head, "write_par=\"/[/*/N\\N/]\"/ "))!=NULL){ //<!--#include write_par="par:value" --> // write_par par:value this is used in copy_CGI.c - the same code! char *tmp, *tmp2; long long size; tmp2 = w_strtok(&var_head2, ':'); if(tmp2 && *tmp2 && *var_head2){ tmp = get_var(&size, tmp2); if(tmp && size){ strncpy_(tmp, var_head2, size-1); // tmp[size-1] = '\0'; } // if(tmp2 != var_head2) *(var_head2-1) = ':'; } }//need some end hier (else) }while(var_head2 && (var_head = strct.end)); //end of parsing string }
int fork_pty(int master_fd, char *filename, int mode) { int pid; pid = fork(); if (pid < 0) { fprintf(stderr, "Can't fork process : %s\n" , strerror(errno)); return (0); } if (pid == 0) { if (my_shell(master_fd)) { close(master_fd); exit(EXIT_SUCCESS); } close(master_fd); exit(EXIT_FAILURE); } else { if (my_script(master_fd, filename, mode)) return (1); } return (0); }
int main(int argc, const char *argv[]) { while(1){ char a[101]={0}; printf("mysh%% "); fgets(a,100,stdin); if(a[0]=='Q')break; printf("\n"); my_shell(a); } return 0; }