Sun Java System Web Server 6.1 SP7 NSAPI Programmer's Guide

Creating and Using Custom SAFs

Custom SAFs are functions in shared libraries that are loaded and called by the server.

ProcedureTo create a custom SAF

  1. Write the Source Code using the NSAPI functions. Each SAF is written for a specific directive.

  2. Compile and Link the source code to create a shared library ( .so , .sl , or .dll) file.

  3. Load and Initialize the SAF by editing the magnus.conf file to:

    • Load the shared library file containing your custom SAF(s)

      • Initialize the SAF if necessary

  4. Instruct the Server to Call the SAFs by editing obj.conf to call your custom SAF(s) at the appropriate time.

  5. Restart the Server .

  6. Test the SAF by accessing your server from a browser with a URL that triggers your function.

    The following sections describe these steps in greater detail.

Write the Source Code

Write your custom SAFs using NSAPI functions. For a summary of some of the most commonly used NSAPI functions, see Overview of NSAPI C Functions available routines, see Chapter 7, NSAPI Function Reference

For examples of custom SAFs, see nsapi/examples/ in the server root directory, and also seeChapter 5, Examples of Custom SAFs and Filters

The signature for all SAFs is:

int function(pblock *pb, Session *sn, Request *rq);

For more details on the parameters, seeSAF Parameters

The Sun Java System Web Server runs as a multi-threaded single process. On UNIX platforms there are actually two processes (a parent and a child), for historical reasons. The parent process performs some initialization and forks the child process. The child process performs further initialization and handles all of the HTTP requests.

Keep the following in mind when writing your SAF:

Compile and Link

Compile and link your code with the native compiler for the target platform. For UNIX, use the gmake command. For Windows, use the nmake command. For Windows, use Microsoft Visual C++ 6.0 or newer. You must have an import list that specifies all global variables and functions to access from the server binary. Use the correct compiler and linker flags for your platform. Refer to the example Makefile in the server_root/plugins/nsapi/examples directory.

Adhere to the following guidelines for compiling and linking.

Include Directory and nsapi.h File

Add the server_root/plugins/include (UNIX) or server_root\plugins\include (Windows) directory to your makefile to include the nsapi.h file.


Add the server_root/bin/https/lib (UNIX) or server_root\bin\https\bin (Windows) library directory to your linker command.

The following table lists the library that you need to link to.

Table 3–1 Libraries




ns-httpd40.dll (in addition to the standard Windows libraries)


All other UNIX platforms

Linker Commands and Options for Generating a Shared Object

To generate a shared library, use the commands and options listed in the following table.

Table 3–2 Linker Commands and Options



Solaris™ Operating System (SPARC® Platform Edition) 

ld -G or cc -G


link -LD


cc +Z -b -Wl,+s -Wl,-B,symbolic


cc -p 0 -berok -blibpath:$(LD_RPATH)


cc -shared


gcc -shared


cc -shared

Additional Linker Flags

Use the linker flags in the following table to specify which directories should be searched for shared objects during runtime to resolve symbols.

Table 3–3 Linker Flags



Solaris SPARC 

-R dir:dir


(no flags, but the ns-httpd40.dll file must be in the system PATH variable)






-rpath dir:dir





On UNIX, you can also set the library search path using the LD_LIBRARY_PATH environment variable, which must be set when you start the server.

Compiler Flags

The following table lists the flags and defines you need to use for compilation of your source code.

Table 3–4 Compiler Flags and Defines



Solaris SPARC 













-o32 -exceptions -DXP_UNIX -KPIC

All platforms 


The following table lists the optional flags and defines you can use.

Table 3–5 Optional Flags and Defines






Needed for the proxy utilities function include file putil.h

Compiling 3.x Plugins on AIX

For AIX only, plug-ins built for 3.x versions of the server must be relinked to work with 4.x and 6.x versions. The files you need, which are in the server_root/plugins/nsapi/examples/ directory, are as follows:

Load and Initialize the SAF

For each shared library (plug-in) containing custom SAFs to be loaded into the Sun Java System Web Server, add an Init directive that invokes the load-modules SAF to magnus.conf.

The syntax for a directive that calls load-modules is:

Init fn=load-modules shlib=[path]sharedlibname funcs="SAF1,...,SAFn"

Init fn=load-modules 

If necessary, also add an Init directive that calls the initialization function for the newly loaded plug-in. For example, if you defined the function init_my_new_SAF() to perform an operation on the maxAnimLoop parameter, you would add a directive such as the following to magnus.conf:

Init fn=init_my_animations maxAnimLoop=5

Instruct the Server to Call the SAFs

Next, add directives to obj.conf to instruct the server to call each custom SAF at the appropriate time. The syntax for directives is:

Directive fn=function-name [name1="value1"]...[nameN="valueN"]

NameTrans fn=pfx2dir from="/animations/small"
dir="D:/Sun/WebServer61/server1/docs/animations/small" name="small_anim"
NameTrans fn=pfx2dir from="/animations/fullscreen"


You also need to define objects that contain the Service directives that run the animations and specify the speed parameter.

<Object name="small_anim">
Service fn=do_small_anim speed=40
<Object name="fullscreen_anim">
Service fn=do_big_anim speed=20


Restart the Server

After modifying obj.conf, you need to restart the server. A restart is required for all plug-ins that implement SAFs and/or filters.

Test the SAF

Test your SAF by accessing your server from a browser with a URL that triggers your function. For example, if your new SAF is triggered by requests to resources in http://server-name/animations/small, try requesting a valid resource that starts with that URI.

You should disable caching in your browser so that the server is sure to be accessed. In Netscape Navigator you may hold the shift key while clicking the Reload button to ensure that the cache is not used. (Note that the shift-reload trick does not always force the client to fetch images from source if the images are already in the cache.)

You may also wish to disable the server cache using the cache-init SAF.

Examine the access log and error log to help with debugging.