#include "support/types.h"
#include "support/FileZipListDir.h"
-#if !defined (HAVE_FORK)
-# define fork() -1
-#endif
-
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
MacroData const * data =
d->parent_buffer->getMacro(*it, *this, false);
if (data)
- data->write(os, true);
+ data->write(os, true);
}
}
};
-#if !defined (HAVE_FORK)
-# define fork() -1
-#endif
-
int AutoSaveBuffer::generateChild()
{
// tmp_ret will be located (usually) in /tmp
// will that be a problem?
+ // Note that this calls ForkedCalls::fork(), so it's
+ // ok cross-platform.
pid_t const pid = fork();
// If you want to debug the autosave
// you should set pid to -1, and comment out the fork.
- if (pid == 0 || pid == -1) {
- // pid = -1 signifies that lyx was unable
- // to fork. But we will do the save
- // anyway.
- bool failed = false;
-
- FileName const tmp_ret = FileName::tempName("lyxauto");
- if (!tmp_ret.empty()) {
- buffer_.writeFile(tmp_ret);
- // assume successful write of tmp_ret
- if (!tmp_ret.moveTo(fname_)) {
- failed = true;
- // most likely couldn't move between
- // filesystems unless write of tmp_ret
- // failed so remove tmp file (if it
- // exists)
- tmp_ret.removeFile();
- }
- } else {
+ if (pid != 0 && pid != -1)
+ return pid;
+
+ // pid = -1 signifies that lyx was unable
+ // to fork. But we will do the save
+ // anyway.
+ bool failed = false;
+ FileName const tmp_ret = FileName::tempName("lyxauto");
+ if (!tmp_ret.empty()) {
+ buffer_.writeFile(tmp_ret);
+ // assume successful write of tmp_ret
+ if (!tmp_ret.moveTo(fname_))
failed = true;
- }
-
- if (failed) {
- // failed to write/rename tmp_ret so try writing direct
- if (!buffer_.writeFile(fname_)) {
- // It is dangerous to do this in the child,
- // but safe in the parent, so...
- if (pid == -1) // emit message signal.
- buffer_.message(_("Autosave failed!"));
- }
- }
- if (pid == 0) { // we are the child so...
- _exit(0);
+ } else
+ failed = true;
+
+ if (failed) {
+ // failed to write/rename tmp_ret so try writing direct
+ if (!buffer_.writeFile(fname_)) {
+ // It is dangerous to do this in the child,
+ // but safe in the parent, so...
+ if (pid == -1) // emit message signal.
+ buffer_.message(_("Autosave failed!"));
}
}
+
+ if (pid == 0) // we are the child so...
+ _exit(0);
+
return pid;
}
if (!success)
return false;
- if (put_in_tempdir)
+ if (put_in_tempdir) {
result_file = tmp_result_file.absFilename();
- else {
- result_file = changeExtension(absFileName(), ext);
- // We need to copy referenced files (e. g. included graphics
- // if format == "dvi") to the result dir.
- vector<ExportedFile> const files =
- runparams.exportdata->externalFiles(format);
- string const dest = onlyPath(result_file);
- CopyStatus status = SUCCESS;
- for (vector<ExportedFile>::const_iterator it = files.begin();
- it != files.end() && status != CANCEL; ++it) {
- string const fmt =
- formats.getFormatFromFile(it->sourceName);
- status = copyFile(fmt, it->sourceName,
- makeAbsPath(it->exportName, dest),
- it->exportName, status == FORCE);
- }
- if (status == CANCEL) {
- message(_("Document export cancelled."));
- } else if (tmp_result_file.exists()) {
- // Finally copy the main file
- status = copyFile(format, tmp_result_file,
- FileName(result_file), result_file,
- status == FORCE);
- message(bformat(_("Document exported as %1$s "
- "to file `%2$s'"),
- formats.prettyName(format),
- makeDisplayPath(result_file)));
- } else {
- // This must be a dummy converter like fax (bug 1888)
- message(bformat(_("Document exported as %1$s"),
- formats.prettyName(format)));
- }
+ return true;
+ }
+
+ result_file = changeExtension(absFileName(), ext);
+ // We need to copy referenced files (e. g. included graphics
+ // if format == "dvi") to the result dir.
+ vector<ExportedFile> const files =
+ runparams.exportdata->externalFiles(format);
+ string const dest = onlyPath(result_file);
+ CopyStatus status = SUCCESS;
+ for (vector<ExportedFile>::const_iterator it = files.begin();
+ it != files.end() && status != CANCEL; ++it) {
+ string const fmt = formats.getFormatFromFile(it->sourceName);
+ status = copyFile(fmt, it->sourceName,
+ makeAbsPath(it->exportName, dest),
+ it->exportName, status == FORCE);
+ }
+ if (status == CANCEL) {
+ message(_("Document export cancelled."));
+ } else if (tmp_result_file.exists()) {
+ // Finally copy the main file
+ status = copyFile(format, tmp_result_file,
+ FileName(result_file), result_file,
+ status == FORCE);
+ message(bformat(_("Document exported as %1$s "
+ "to file `%2$s'"),
+ formats.prettyName(format),
+ makeDisplayPath(result_file)));
+ } else {
+ // This must be a dummy converter like fax (bug 1888)
+ message(bformat(_("Document exported as %1$s"),
+ formats.prettyName(format)));
}
return true;