Switch to side-by-side view

--- a/src/utils/execmd.cpp
+++ b/src/utils/execmd.cpp
@@ -1,5 +1,5 @@
 #ifndef lint
-static char rcsid[] = "@(#$Id: execmd.cpp,v 1.18 2006-10-09 16:37:08 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: execmd.cpp,v 1.19 2006-10-11 16:09:45 dockes Exp $ (C) 2004 J.F.Dockes";
 #endif
 /*
  *   This program is free software; you can redistribute it and/or modify
@@ -93,7 +93,7 @@
     }
 };
 
-	
+
 int ExecCmd::doexec(const string &cmd, const list<string>& args,
 		const string *inputstring, string *output)
 {
@@ -181,9 +181,21 @@
 		    }
 		    nwritten += n;
 		    if (nwritten == inputlen) {
-			// cerr << "Closing output" << endl;
-			close(e.pipein[1]);
-			e.pipein[1] = -1;
+			if (m_provide) {
+			    m_provide->newData();
+			    if (inputstring->empty()) {
+				close(e.pipein[1]);
+				e.pipein[1] = -1;
+			    } else {
+				input = inputstring->data();
+				inputlen = inputstring->length();
+				nwritten = 0;
+			    }
+			} else {
+			    // cerr << "Closing output" << endl;
+			    close(e.pipein[1]);
+			    e.pipein[1] = -1;
+			}
 		    }
 		}
 		if (e.pipeout[0] > 0 && FD_ISSET(e.pipeout[0], &readfds)) {
@@ -300,6 +312,9 @@
     return -1;
 }
 
+
+
+////////////////////////////////////////////////////////////////////
 #else // TEST
 #include <stdio.h>
 #include <string>
@@ -324,33 +339,100 @@
     }
 };
 
-int main(int argc, const char **argv)
+class MEPv : public ExecCmdProvide {
+public:
+    FILE *m_fp;
+    string *m_input;
+    MEPv(string *i) 
+	: m_input(i)
+    {
+	m_fp = fopen("/etc/group", "r");
+    }
+    ~MEPv() {
+	if (m_fp)
+	    fclose(m_fp);
+    }
+    void newData() {
+	char line[1024];
+	if (m_fp && fgets(line, 1024, m_fp)) {
+	    m_input->assign((const char *)line);
+	} else {
+	    m_input->erase();
+	}
+    }
+};
+
+
+static char *thisprog;
+static char usage [] =
+"execmd cmd [arg1 arg2 ...]\n" 
+"  \n\n"
+;
+static void Usage(void)
 {
+    fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
+    exit(1);
+}
+
+static int     op_flags;
+#define OPT_MOINS 0x1
+#define OPT_s	  0x2 
+#define OPT_b	  0x4 
+
+int main(int argc, char **argv)
+{
+    int count = 10;
+    
+    thisprog = argv[0];
+    argc--; argv++;
+
+    while (argc > 0 && **argv == '-') {
+	(*argv)++;
+	if (!(**argv))
+	    /* Cas du "adb - core" */
+	    Usage();
+	while (**argv)
+	    switch (*(*argv)++) {
+	    case 's':	op_flags |= OPT_s; break;
+	    case 'b':	op_flags |= OPT_b; if (argc < 2)  Usage();
+		if ((sscanf(*(++argv), "%d", &count)) != 1) 
+		    Usage(); 
+		argc--; 
+		goto b1;
+	    default: Usage();	break;
+	    }
+    b1: argc--; argv++;
+    }
+
+    if (argc < 1)
+	Usage();
+
+    string cmd = *argv++; argc--;
+    list<string> l;
+    while (argc > 0) {
+	l.push_back(*argv++); argc--;
+    }
+
     DebugLog::getdbl()->setloglevel(DEBDEB1);
     DebugLog::setfilename("stderr");
-    if (argc < 2) {
-	cerr << "Usage: execmd cmd arg1 arg2 ..." << endl;
-	exit(1);
-    }
-    const string cmd = argv[1];
-    list<string> l;
-    for (int i = 2; i < argc; i++) {
-	l.push_back(argv[i]);
-    }
+
     ExecCmd mexec;
     MEAdv adv;
     adv.cmd = &mexec;
     mexec.setAdvise(&adv);
     mexec.setTimeout(500);
     mexec.setStderr("/tmp/trexecStderr");
-
-    string input, output;
-    input = data;
-    string *ip = 0;
-    ip = &input;
     mexec.putenv("TESTVARIABLE1=TESTVALUE1");
     mexec.putenv("TESTVARIABLE2=TESTVALUE2");
     mexec.putenv("TESTVARIABLE3=TESTVALUE3");
+
+    string input, output;
+    //    input = data;
+    string *ip = 0;
+    ip = &input;
+
+    MEPv  pv(&input);
+    mexec.setProvide(&pv);
 
     int status = -1;
     try {
@@ -360,7 +442,7 @@
     }
 
     fprintf(stderr, "Status: 0x%x\n", status);
-    cout << "Output:" << output << endl;
+    cout << "Output:[" << output << "]" << endl;
     exit (status >> 8);
 }
 #endif // TEST