3. First Step: Hello world
As usual, we will start with the famous "Hello world" program. The source code for hello.nlm is available in the nlm-samples package. You can download it from ftp://ftp.penguin.cz/pub/users/mhi/nlm/.
3.1 hello.c - Source File
#define N_PLAT_NLM /* Define dest. platform */ #include <nwconio.h> /* ConsolePrintf */ int main (int argc, char **argv) { int i; ConsolePrintf ("\rHello world!\n\n"); /* print on system console */ ConsolePrintf("Arguments:\n"); /* all arguments */ for (i=0;i<argc;i++) ConsolePrintf("argv[%u]=\"%s\"\n",i, argv[i]); return 0; /* exit NLM */ }
3.2 hello.def - NLM header file
# # hello.def - NLM Header definition file for nlmconv(1) # Copyright (c) 2000 Martin Hinner <martin@hinner.info> # # define startup object files INPUT hello.o INPUT /usr/nwsdk/lib/prelude.o # clib startup code # all imported functions and import lists IMPORT @/usr/nwsdk/imports/clib.imp # Functions in CLIB.NLM IMPORT @/usr/nwsdk/imports/threads.imp # Functions in THREADS.NLM # NLM header... OUTPUT hello.nlm # output file TYPE 0 # Ordinary NLM VERSION 1,0,0 # Version 1.0 COPYRIGHT "Copyright (c) 2000 Martin Hinner <martin@hinner.info>" # (c) ... DESCRIPTION "Simple 'Hello world' NLM module." # title of nlm SCREENNAME "System Console" # Default screen name MODULE CLIB,THREADS # req'd modules
3.3 Makefile
# makefile for "hello world" NLM CC = gcc CFLAGS = -Wall -O2 -g -I/usr/nwsdk/include/ -nostdinc -fno-builtin -fpack-struct hello.nlm: hello.o hello.def nlmconv --output-target=nlm32-i386 -T hello.def hello.o: hello.c $(CC) $(CFLAGS) -c hello.c
3.4 GCC problems
You must pass these arguments to the gcc:
- -fno-builtin: GCC's fast builtin functions sometimes cause server to abend, so we don't want to use them.
- -nostdinc: Only include files in /usr/nwsdk/include are valid for NLMs (don't forget to use also -I/usr/nwsdk/include).
- -fpack-struct: GCC's struct packing method is not valid for Novell NetWare, so we won't use it. Thanks to Gabor Keresztvalvi for this information.
- -fno-canary-all-functions: If you have Immunix StackGuard GCC, we don't want to use it. StackGuard doesn't work under NetWare.
3.5 Testing the Module
Copy hello.nlm to the SYS:\SYSTEM directory on your NetWare server. Then, on the system console, type "load hello.nlm". If everything went fine, you should see NLM version information, a copyright message and "Hello world".
Next Previous Contents