X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/86051ed1b66342bae0e21fd6643e66331ac2c07d..a95ea5c578ac402346f202c411986425fb1fcf8b:/tools/tesh/tesh.c diff --git a/tools/tesh/tesh.c b/tools/tesh/tesh.c index 98a6d14da5..9fcee3e11a 100644 --- a/tools/tesh/tesh.c +++ b/tools/tesh/tesh.c @@ -21,10 +21,8 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(tesh,"TEst SHell utility"); /*** Options ***/ int timeout_value = 5; /* child timeout value */ - +char *testsuite_name; static void handle_line(const char * filepos, char *line) { - int pos; - /* Search end */ xbt_str_rtrim(line+2,"\n"); @@ -34,85 +32,88 @@ static void handle_line(const char * filepos, char *line) { rctx->input->used, rctx->input->data, rctx->output_wanted->used,rctx->output_wanted->data, rctx->output_got->used, rctx->output_got->data); - */ + */ DEBUG2("[%s] %s",filepos,line); switch (line[0]) { - case '#': break; - - case '$': - /* further trim useless chars which are significant for in/output */ - xbt_str_rtrim(line+2," \t"); + case '#': break; + + case '$': + /* further trim useless chars which are significant for in/output */ + xbt_str_rtrim(line+2," \t"); + + /* Deal with CD commands here, not in rctx */ + if (!strncmp("cd ",line+2,3)) { + char *dir=line+4; + + if (rctx->cmd) + rctx_start(); + + /* search beginning */ + while (*(dir++) == ' '); + dir--; + VERB1("Saw cd '%s'",dir); + if (chdir(dir)) { + ERROR2("Chdir to %s failed: %s",dir,strerror(errno)); + ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + rctx_armageddon(rctx,4); + } + break; + } /* else, pushline */ + case '&': + case '<': + case '>': + case '!': + rctx_pushline(filepos, line[0], line+2 /* pass '$ ' stuff*/); + break; - /* Deal with CD commands here, not in rctx */ - if (!strncmp("cd ",line+2,3)) { - char *dir=line+4; + case 'p': + INFO2("[%s] %s",filepos,line+2); + break; + case 'P': + CRITICAL2("[%s] %s",filepos,line+2); + break; - if (rctx->cmd) - rctx_start(); - - /* search begining */ - while (*(dir++) == ' '); - dir--; - VERB1("Saw cd '%s'",dir); - if (chdir(dir)) { - char buff[256]; - strerror_r(errno, buff, 256); - - ERROR2("Chdir to %s failed: %s",dir+pos+2,buff); - exit(4); - } + default: + ERROR2("[%s] Syntax error: %s",filepos, line); + ERROR1("Test suite `%s': NOK (syntax error)",testsuite_name); + rctx_armageddon(rctx,1); break; - } /* else, pushline */ - case '&': - case '<': - case '>': - case '!': - rctx_pushline(filepos, line[0], line+2 /* pass '$ ' stuff*/); - break; - - case 'p': - INFO2("[%s] %s",filepos,line+2); - break; - - default: - ERROR2("[%s] Syntax error: %s",filepos, line); - exit(1); - break; } } static void handle_suite(const char* filename, FILE* IN) { - int len; + size_t len; char * line = NULL; int line_num=0; char file_pos[256]; - buff_t buff=buff_new(); - int buffbegin = 0; + xbt_strbuff_t buff=xbt_strbuff_new(); + int buffbegin = 0; rctx = rctx_new(); - while (getline(&line,(size_t*) &len, IN) != -1) { + while (getline(&line, &len, IN) != -1) { line_num++; /* Count the line length while checking wheather it's blank */ int blankline=1; - int linelen = 0; + int linelen = 0; while (line[linelen] != '\0') { if (line[linelen] != ' ' && line[linelen] != '\t' && line[linelen]!='\n') - blankline = 0; + blankline = 0; linelen++; } - + if (blankline) { if (!rctx->cmd && !rctx->is_empty) { - ERROR1("[%d] Error: no command found in this chunk of lines.", - buffbegin); - exit(1); + ERROR1("[%d] Error: no command found in this chunk of lines.", + buffbegin); + ERROR1("Test suite `%s': NOK (syntax error)",testsuite_name); + rctx_armageddon(rctx,1); } if (rctx->cmd) - rctx_start(); + rctx_start(); continue; } @@ -121,34 +122,34 @@ static void handle_suite(const char* filename, FILE* IN) { int to_be_continued = 0; if (linelen>1 && line[linelen-2]=='\\') { if (linelen>2 && line[linelen-3] == '\\') { - /* Damn. Escaped \ */ - line[linelen-2] = '\n'; - line[linelen-1] = '\0'; + /* Damn. Escaped \ */ + line[linelen-2] = '\n'; + line[linelen-1] = '\0'; } else { - to_be_continued = 1; - line[linelen-2] = '\0'; - linelen -= 2; - if (!buff->used) - buffbegin = line_num; + to_be_continued = 1; + line[linelen-2] = '\0'; + linelen -= 2; + if (!buff->used) + buffbegin = line_num; } } - if (buff->used || to_be_continued) { - buff_append(buff,line); + if (buff->used || to_be_continued) { + xbt_strbuff_append(buff,line); if (!to_be_continued) { - snprintf(file_pos,256,"%s:%d",filename,buffbegin); - handle_line(file_pos, buff->data); - buff_empty(buff); + snprintf(file_pos,256,"%s:%d",filename,buffbegin); + handle_line(file_pos, buff->data); + xbt_strbuff_empty(buff); } - + } else { snprintf(file_pos,256,"%s:%d",filename,line_num); - handle_line(file_pos, line); + handle_line(file_pos, line); } } /* Check that last command of the file ran well */ - if (rctx->cmd) + if (rctx->cmd) rctx_start(); /* Wait all background commands */ @@ -158,8 +159,21 @@ static void handle_suite(const char* filename, FILE* IN) { /* Clear buffers */ if (line) free(line); - buff_free(buff); + xbt_strbuff_free(buff); + +} +static void parse_environ(){ + char *p; + int i; + env = xbt_dict_new(); + for (i=0; environ[i];i++) { + p=environ[i]; + char *eq = strchr(p,'='); + char *key = bprintf("%.*s",(int)(eq-p),p); + xbt_dict_set(env,key,xbt_strdup(eq+1),xbt_free_f); + free(key); + } } int main(int argc,char *argv[]) { @@ -167,42 +181,46 @@ int main(int argc,char *argv[]) { FILE *IN; /* Ignore pipe issues. - They will show up when we try to send data to dead buddies, + They will show up when we try to send data to dead buddies, but we will stop doing so when we're done with provided input */ struct sigaction newact; memset(&newact,0, sizeof(newact)); newact.sa_handler=SIG_IGN; sigaction(SIGPIPE,&newact,NULL); - + xbt_init(&argc,argv); rctx_init(); + parse_environ(); /* Find the description file */ if (argc == 1) { INFO0("Test suite from stdin"); + testsuite_name = xbt_strdup("(stdin)"); handle_suite("stdin",stdin); INFO0("Test suite from stdin OK"); - + } else { int i; - + for (i=1; ileads to segfault on amd64... + fclose(IN); INFO1("Test suite `%s' OK",suitename); free(suitename); } @@ -210,6 +228,6 @@ int main(int argc,char *argv[]) { rctx_exit(); xbt_exit(); - return 0; + return 0; }