/*****************************************************************************/ /* CGIplusCallout.c Example CGIplus script illustrating the use of callouts. Uses the CGILIB routines. Also see CGIPLUSCALLOUTPROC.COM which directly manipulates the required environment variables, etc., and so could be used as an example for creating non-C-language scripts and agents. BUILD DETAILS ------------- See BUILD_ONE.COM procedure. $ @BUILD_ONE BUILD CGIPLUSCALLOUT $ @BUILD_ONE LINK CGIPLUSCALLOUT COPYRIGHT --------- Copyright (C) 1999-2021 Mark G.Daniel Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. VERSION HISTORY --------------- 06-OCT-2004 MGD v1.2.0, CGILIB object library 06-SEP-1999 MGD v1.0.0, initial development */ /*****************************************************************************/ /* standard C header files */ #include #include #include #include #include #include #include #include "cgilib.h" void ProcessRequest (); /*****************************************************************************/ /* */ main () { int status; /*********/ /* begin */ /*********/ CgiLibEnvironmentInit (0, NULL, 0); /* MUST only be executed in a CGIplus environment! */ if (!CgiLibEnvironmentIsCgiPlus ()) exit (SS$_ABORT); for (;;) { /* block waiting for the next request */ CgiLibVar (""); ProcessRequest (); CgiLibCgiPlusEOF (); } } /*****************************************************************************/ /* Main authentication request processing function. */ void ProcessRequest () { static int UsageCount = 0; char ExampleFile [] = "WASD_ROOT:[SRC.HTTPD]", ExamplePath [] = "/wasd_root/src/httpd/"; char Response [256]; /*********/ /* begin */ /*********/ UsageCount++; CgiLibResponseHeader (200, "text/html"); fprintf (stdout, "CGIPLUSCALLOUT.C\n\

Usage count: %d\n\ \

This script provides a simple demonstration of the CGIplus callout\n\ facility, used to suspend normal script output and communicate directly with\n\ the server. This allows the script to request information from the server,\n\ or set certain script operating parameters, etc.\n\ \

To begin an callout the CGIPLUSESC environment variable (logical\n\ name) is output as a record. For this script it has a value of:\n\

  %s
\n\

(but of course is not static, and varies each time the script is first\n\ executed).\n\ \

A single-record script request followed by a single-record server response\n\ dialog may then be engaged in.\n\ \

To end an callout the CGIPLUSEOT environment variable (logical\n\ name) is output as a record. For this script it has a value of:\n\

  %s
\n\

(and also will vary each time the script is first executed).\n\ \

Normal script output (to the browser) is then resumed. When in\n\ callout mode one or more request/responses may be made. Normal and\n\ callout output may be interleaved during a script response, as this script\n\ illustrates.\n\ \

Example Behaviour\n\ \

    \n\ \
  • Translating a URL-style path to a VMS file specification:\n\
      %s
    \n\

    The request sent to the server was:\n\

      MAP-PATH: %s
    \n", UsageCount, getenv("CGIPLUSESC"), getenv("CGIPLUSEOT"), ExamplePath, ExamplePath); /* provide the server attention "escape" sequence record */ CgiLibCgiPlusESC (); /* remember, this dialog is record-oriented, so fflush() as necessary */ fprintf (stdout, "MAP-PATH: %s", ExamplePath); fflush (stdout); CgiLibCgiPlusInGets (Response, sizeof(Response)); /* provide the "escape" end-of-text sequence record */ CgiLibCgiPlusEOT (); fprintf (stdout, "

    The full server response was:\n\

      %s
    \n\

    Yielding a file specification of:\n\

      %s
    \n\ \
  • Now a translation of a VMS file specification into a URL-style path:\n\
      %s
    \n\

    The request sent to the server was:\n\

      MAP-FILE: %s
    \n", Response, Response+4, ExampleFile, ExampleFile); CgiLibCgiPlusESC (); fprintf (stdout, "MAP-FILE: %s", ExampleFile); fflush (stdout); CgiLibCgiPlusInGets (Response, sizeof(Response)); CgiLibCgiPlusEOT (); fprintf (stdout, "

    The full server response was:\n\

      %s
    \n\

    Yielding a path of:\n\

      %s
    \n\ \
  • Finally an error response to an unknown callout request:\n\

    The request sent to the server was:\n\

      UNKNOWN?: %s
    \n", Response, Response+4, ExampleFile); CgiLibCgiPlusESC (); fprintf (stdout, "UNKNOWN: %s", ExampleFile); fflush (stdout); CgiLibCgiPlusInGets (Response, sizeof(Response)); CgiLibCgiPlusEOT (); fprintf (stdout, "

    The full server response was:\n\

      %s
    \n\ \
\n\ \ Comments\n\

Success responses begin with an HTTP-like "200",\n\ other responses with appropriate status codes.\n", Response); } /*****************************************************************************/