summaryrefslogtreecommitdiff
path: root/os2/OS2/Process
diff options
context:
space:
mode:
Diffstat (limited to 'os2/OS2/Process')
-rw-r--r--os2/OS2/Process/MANIFEST4
-rw-r--r--os2/OS2/Process/Makefile.PL10
-rw-r--r--os2/OS2/Process/Process.pm112
-rw-r--r--os2/OS2/Process/Process.xs154
4 files changed, 280 insertions, 0 deletions
diff --git a/os2/OS2/Process/MANIFEST b/os2/OS2/Process/MANIFEST
new file mode 100644
index 0000000000..0d90d15fca
--- /dev/null
+++ b/os2/OS2/Process/MANIFEST
@@ -0,0 +1,4 @@
+MANIFEST
+Makefile.PL
+Process.pm
+Process.xs
diff --git a/os2/OS2/Process/Makefile.PL b/os2/OS2/Process/Makefile.PL
new file mode 100644
index 0000000000..ff4deabef6
--- /dev/null
+++ b/os2/OS2/Process/Makefile.PL
@@ -0,0 +1,10 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile(
+ 'NAME' => 'OS2::Process',
+ 'VERSION' => '0.1',
+ 'LIBS' => [''], # e.g., '-lm'
+ 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
+ 'INC' => '', # e.g., '-I/usr/include/other'
+);
diff --git a/os2/OS2/Process/Process.pm b/os2/OS2/Process/Process.pm
new file mode 100644
index 0000000000..9216bb1e05
--- /dev/null
+++ b/os2/OS2/Process/Process.pm
@@ -0,0 +1,112 @@
+package OS2::Process;
+
+require Exporter;
+require DynaLoader;
+require AutoLoader;
+
+@ISA = qw(Exporter DynaLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+@EXPORT = qw(
+ P_BACKGROUND
+ P_DEBUG
+ P_DEFAULT
+ P_DETACH
+ P_FOREGROUND
+ P_FULLSCREEN
+ P_MAXIMIZE
+ P_MINIMIZE
+ P_NOCLOSE
+ P_NOSESSION
+ P_NOWAIT
+ P_OVERLAY
+ P_PM
+ P_QUOTE
+ P_SESSION
+ P_TILDE
+ P_UNRELATED
+ P_WAIT
+ P_WINDOWED
+);
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ local($constname);
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($! =~ /Invalid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ ($pack,$file,$line) = caller;
+ die "Your vendor has not defined OS2::Process macro $constname, used at $file line $line.
+";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+bootstrap OS2::Process;
+
+# Preloaded methods go here.
+
+# Autoload methods go after __END__, and are processed by the autosplit program.
+
+1;
+__END__
+
+=head1 NAME
+
+OS2::Process - exports constants for system() call on OS2.
+
+=head1 SYNOPSIS
+
+ use OS2::Process;
+ $pid = system(P_PM+P_BACKGROUND, "epm.exe");
+
+=head1 DESCRIPTION
+
+the builtin function system() under OS/2 allows an optional first
+argument which denotes the mode of the process. Note that this argument is
+recognized only if it is strictly numerical.
+
+You can use either one of the process modes:
+
+ P_WAIT (0) = wait until child terminates (default)
+ P_NOWAIT = do not wait until child terminates
+ P_SESSION = new session
+ P_DETACH = detached
+ P_PM = PM program
+
+and optionally add PM and session option bits:
+
+ P_DEFAULT (0) = default
+ P_MINIMIZE = minimized
+ P_MAXIMIZE = maximized
+ P_FULLSCREEN = fullscreen (session only)
+ P_WINDOWED = windowed (session only)
+
+ P_FOREGROUND = foreground (if running in foreground)
+ P_BACKGROUND = background
+
+ P_NOCLOSE = don't close window on exit (session only)
+
+ P_QUOTE = quote all arguments
+ P_TILDE = MKS argument passing convention
+ P_UNRELATED = do not kill child when father terminates
+
+=head1 AUTHOR
+
+Andreas Kaiser <ak@ananke.s.bawue.de>.
+
+=head1 SEE ALSO
+
+C<spawn*>() system calls.
+
+=cut
diff --git a/os2/OS2/Process/Process.xs b/os2/OS2/Process/Process.xs
new file mode 100644
index 0000000000..bdb2ece7a0
--- /dev/null
+++ b/os2/OS2/Process/Process.xs
@@ -0,0 +1,154 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#include <process.h>
+
+static int
+not_here(s)
+char *s;
+{
+ croak("%s not implemented on this architecture", s);
+ return -1;
+}
+
+static unsigned long
+constant(name, arg)
+char *name;
+int arg;
+{
+ errno = 0;
+ if (name[0] == 'P' && name[1] == '_') {
+ if (strEQ(name, "P_BACKGROUND"))
+#ifdef P_BACKGROUND
+ return P_BACKGROUND;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_DEBUG"))
+#ifdef P_DEBUG
+ return P_DEBUG;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_DEFAULT"))
+#ifdef P_DEFAULT
+ return P_DEFAULT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_DETACH"))
+#ifdef P_DETACH
+ return P_DETACH;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_FOREGROUND"))
+#ifdef P_FOREGROUND
+ return P_FOREGROUND;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_FULLSCREEN"))
+#ifdef P_FULLSCREEN
+ return P_FULLSCREEN;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_MAXIMIZE"))
+#ifdef P_MAXIMIZE
+ return P_MAXIMIZE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_MINIMIZE"))
+#ifdef P_MINIMIZE
+ return P_MINIMIZE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_NOCLOSE"))
+#ifdef P_NOCLOSE
+ return P_NOCLOSE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_NOSESSION"))
+#ifdef P_NOSESSION
+ return P_NOSESSION;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_NOWAIT"))
+#ifdef P_NOWAIT
+ return P_NOWAIT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_OVERLAY"))
+#ifdef P_OVERLAY
+ return P_OVERLAY;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_PM"))
+#ifdef P_PM
+ return P_PM;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_QUOTE"))
+#ifdef P_QUOTE
+ return P_QUOTE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_SESSION"))
+#ifdef P_SESSION
+ return P_SESSION;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_TILDE"))
+#ifdef P_TILDE
+ return P_TILDE;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_UNRELATED"))
+#ifdef P_UNRELATED
+ return P_UNRELATED;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_WAIT"))
+#ifdef P_WAIT
+ return P_WAIT;
+#else
+ goto not_there;
+#endif
+ if (strEQ(name, "P_WINDOWED"))
+#ifdef P_WINDOWED
+ return P_WINDOWED;
+#else
+ goto not_there;
+#endif
+ }
+
+ errno = EINVAL;
+ return 0;
+
+not_there:
+ errno = ENOENT;
+ return 0;
+}
+
+
+MODULE = OS2::Process PACKAGE = OS2::Process
+
+
+unsigned long
+constant(name,arg)
+ char * name
+ int arg
+