version 1.9.2

This commit is contained in:
2023-02-10 21:32:20 +01:00
parent 6aa69ddd08
commit 13d2c1384b
13 changed files with 1504 additions and 1286 deletions
+19 -81
View File
@@ -5,6 +5,8 @@ using namespace std;
#define READ 0
#define WRITE 1
extern QMap<int, QString> rsyncErrorStrings;
//Take a string and explode it in array
// s => string to explode
// c => character separator
@@ -41,90 +43,26 @@ const vector<string> explode(const string& s, const char& c, int n = 0)
return v;
}
// open a pipe, fork and return pid of child
// argv => array of string with command in first and parameters following
FILE * popen2(array<string,8> argv, string type, int & pid)
bool testRsyncReturn(QProcess * myProcess)
{
pid_t child_pid;
int fd[2];
QString message;
string command;
if (pipe(fd) == -1)
if (myProcess->exitStatus() != 0)
{
message = "Open pipe failed" + QString::fromStdString(strerror(errno));
QMessageBox::warning(
NULL,
"RsyncUI",
message);
exit(-1);
}else
NULL,
"RsyncUI",
myProcess->errorString(),
QMessageBox::Ok,
QMessageBox::Ok);
return true;
}else if (myProcess->exitCode() != 0)
{
if((child_pid = fork()) == -1)
{
perror("fork");
exit(1);
}
/* child process */
if (child_pid == 0)
{
if (type == "r")
{
close(fd[READ]); //Close the READ end of the pipe since the child's fd is write-only
dup2(fd[WRITE], 1); //Redirect stdout to pipe
}
else
{
close(fd[WRITE]); //Close the WRITE end of the pipe since the child's fd is read-only
dup2(fd[READ], 0); //Redirect stdin to pipe
}
setpgid(child_pid, child_pid); //Needed so negative PIDs can kill children of /bin/sh
//TODO : change for execvp
if (execlp(argv[0].c_str(), argv[0].c_str(), argv[1].c_str(), argv[2].c_str(), argv[3].c_str(), argv[4].c_str(), argv[5].c_str(), NULL ) == -1)
exit (0);
}
else
{
if (type == "r")
{
close(fd[WRITE]); //Close the WRITE end of the pipe since parent's fd is read-only
}
else
{
close(fd[READ]); //Close the READ end of the pipe since parent's fd is write-only
}
}
pid = child_pid;
if (type == "r")
{
return fdopen(fd[READ], "r");
}
return fdopen(fd[WRITE], "w");
QMessageBox::warning(
NULL,
"RsyncUI",
rsyncErrorStrings[myProcess->exitCode()],
QMessageBox::Ok,
QMessageBox::Ok);
return true;
}
return 0;
return false;
}
// close pipe open by popen2 while pid is finished
// fp => file pointer
// pid => pid of the processus open bu popen2
int pclose2(FILE * fp, pid_t pid)
{
int stat;
fclose(fp);
while (waitpid(pid, &stat, 0) == -1)
{
if (errno != EINTR)
{
stat = -1;
break;
}
}
return stat;
}