MSWSP: heur dissectors take a data pointer
[wireshark-wip.git] / doc / README.wslua
blob4deb39682dc230abc773b3659d0c2a5d59fa4fe3
1 README.wslua
3 This is a HOWTO for adding support for new Lua hooks/functions/abilities in
4 Wireshark.   If you see any errors or have any improvements, submit patches -
5 free software is a community effort....
7 This is NOT a guide for how to write Lua plugins - that's documented already
8 on the Wireshark webpages.
10 Contributors to this README:
11 Hadriel Kaplan <hadrielk[AT]yahoo.com>
13 ==============================================================================
15 Overview:
17 The way WireShark exposes functions for Lua is generally based on a
18 callback/event model, letting Lua plugins register their custom Lua functions
19 into event callbacks.  C-based "objects" are exposed as Lua tables with
20 typical Lua USERDATA pointer dispatching, plain C-functions are registered as
21 such in Lua, and C-based enums/variables are registered into Lua as table
22 key=value (usually... though rarely they're registered as array indexed
23 values).  All of that is very typical for appplications that expose things
24 into a Lua scripting environment.
26 The details that make it a little different are (1) the process by which the
27 code is bound/registered into Lua, and (2) the documentation generator.
28 WireShark uses C-macros liberally, both for the usual reasons as well as for
29 the binding generator and documentation generator scripts.  The macros are
30 described within this document.
32 The API documentation is auto-generated from a Perl script called 'make-
33 wsluarm.pl', which searches C-files for the known macros and generates
34 appropriate HTML documentation from them.  This includes using the C-comments
35 after the macros for the document info.
37 Likewise, another Perl script called 'make-reg.pl' generates the C-files
38 'register_wslua.c' and 'declare_wslua.h', based on the C-macros it searches
39 for in existing source files.  The code this Perl script auto-generates is
40 what actually registers some classes/functions into Lua - you don't have to
41 write your own registration functions to get your new functions/classes into
42 Lua tables. (you can do so, however)
44 Both of the perl scripts above are given the C-source files to search through
45 by the make process, generated from the lists in CMakeLists.txt.  Naturally if
46 you add new source files, you need to add them to the list in CMakeLists.txt.
48 Another Perl script is used as well, called 'make-init-lua.pl', which
49 generates the init.lua script.  A large part of it deals with exposing #define
50 values into the Lua global table, or sub-tables.  Unfortunately not all of
51 them are put in sub-tables, which means the global Lua table is quite polluted
52 now.  If you add new ones in here, please think of putting them in a subtable,
53 as they are for wtap, ftypes, and base.  For example, there are several put in
54 as 'PI_' prefixed names, such as 'PI_SEVERITY_MASK = 15728640'.  The fact they
55 all have a common 'PI_' prefix should be an indicator they can be put in a
56 table named PI, or PacketInfo.  Just because C-code doesn't have namespaces,
57 doesn't mean Lua can't.
60 Due to those documentation and registration scripts, you MUST follow some very
61 specific conventions in the functions you write to expose C-side code to Lua,
62 as described in this document.
64 Naming conventions/rules:
66 Class/object names must be UpperCamelCase, no numbers/underscores.
67 Function and method names must be lower_underscore_case, no numbers.
68 Constants/enums must be ALLCAPS, and can have numbers.
70 The above rules are more than merely conventions - the Perl scripts which
71 auto-generate stuff use regex patterns that require the naming syntax to be
72 followed.
74 ==============================================================================
76 Some implementation details:
78 Creating new C-classes for Lua:
80 Explaining the Lua class/object model and how it's bound to C-code functions
81 and data types is beyond the scope of this document; if you don't already know
82 how that works, I suggest you start reading lua-users.org's wiki, and
83 lua.org's free reference manual.  Wireshark generally uses the typical binding
84 model: 'registering' class methods and metamethods, pushing objects into Lua
85 by applying the class' metatable to the USERDATA, etc.  This latter part is
86 mostly handled for you by the C-macro's created by WSLUA_CLASS_DEFINE, such as
87 push/check, described later in this document.  Registering the class requires
88 you to write some code: a WSLUA_METHODS table, a WSLUA_META table, and a
89 registration function.  The WSLUA_METHODS table is an array of luaL_Reg
90 structs, which map a string name that will be the function's name in Lua, to a
91 C-function pointer which is the C-function to be invoked by Lua when the user
92 calls the name.  Some of the existing classes define this array of structs
93 explicitly using strings and function names, but really you should use the
94 WSLUA_CLASS_FNREG macro for each entry instead.  The WSLUA_META table follows
95 the same behavior, but make sure your C-function names use two underscores
96 instead of one.  There is no WSLUA_CLASS_FNREG equivalent for WSLUA_META at
97 the time of this writing.  Once you've created the appropriate array tables,
98 define a registration function named 'ClassName_register', where 'ClassName'
99 is your class name, the same one used in WSLUA_CLASS_DEFINE.  The make-reg.pl
100 Perl script will search your file for WSLUA_CLASS_DEFINE, and it generates a
101 register_wslua.c which will call your ClassName_register function during
102 Wireshark intiialization.  Inside your ClassName_register function, use either
103 the WSLUA_REGISTER_CLASS or the WSLUA_REGISTER_META macros with the class name
104 as the argument.  That will automatically register the methods/meta tables
105 into Lua.  Use WSLUA_REGISTER_CLASS if your class has methods and optionally
106 metamethods, or use WSLUA_REGISTER_META if it only has metamethods - do not
107 use both.  Note that your class does not need to have a WSLUA_METHODS or
108 WSLUA_META table.  Also, you should read the 'Memory management model' section
109 later in this document.
111 Class member variable accessors (getters/setters):
113 The current implementation does not follow a single/common class-variable
114 accessor model for the Lua API: some class member values are
115 populated/retrieved when a table field accessor is used that triggers the
116 __index metamethod, and others are accessed through explicit getter/setter
117 method functions.  In other words from a Lua code perspective some class
118 object variables are retrieves as 'foo = myObj.var', while others are done as
119 'foo = myObj.getVar()'.  From the C-side code perspective, some classes
120 register no real method functions but just have a C-function handle the
121 __index/__newindex metamethods to dispatch to C-functions for the given class
122 table's field name (and they use the WSLUA_ATTRIBUTE documentation model
123 because of it).  For example the FieldInfo class in wslua_field.c does this.
124 Other classes provide access to member variable through getter/setter method
125 functions (and thus use the WSLUA_METHOD model).  For example the TvbRange
126 class in wslua_tvb.c does this.  Using the latter model of having a
127 getter/setter method function allows one to pass multiple arguments, whereas
128 the former __index/__newindex metamethod model does not.  Both models are
129 fairly common in Lua APIs, although having a mixture of both in the same API
130 probably isn't.  There is even a third model in use: pre-loading the member
131 fields of the class table with the values, instead of waiting for the Lua
132 script to access a particular one to retrieve it; for exmaple the Listener tap
133 extractors table is pre-populated (see files 'wslua_listener.c' and 'taps'
134 which through the make-taps.pl perl script creates 'taps_wslua.c').  The
135 downside of that approach is the performance impact, filling fields the Lua
136 script may never access.  Lastly, the Field, FieldInfo, and Tvb's ByteArray
137 type each provide a __call metamethod as an accessor - I strongly suggest you
138 do NOT do that, as it's not a common model and will confuse people since it
139 doesn't follow the model of the other classes in Wireshark.
141 Callback function registration:
143 For some callbacks, there are register_* Lua global functions, which take a
144 user-defined Lua function name as the argument - the one to be hooked into
145 that event.  Unlike in most Lua APIs, there's a unique register_foo() function
146 for each event type, instead of a single register() with the event as an
147 argument.  For example there's a register_postdissector() function.  In some
148 cases the Lua functions are invoked based on a pre-defined function-name model
149 instead of explicit register_foo(), whereby a C-object looks for a defined
150 member variable in the Registry that repesents a Lua function created by the
151 plugin.  This would be the case if the Lua plugin had defined a pre-defined
152 member key of its object's table in Lua, for that purpose.  For example if the
153 Lua plugin sets the 'reset' member of the Listener object table to a function,
154 then Wireshark creates a Registry entry for that Lua function, and executes
155 that Lua function when the Listener resets. (see the example Listener Lua
156 script in the online docs) That model is only useful if the object can only be
157 owned by one plugin so only one function is ever hooked, obviously, and thus
158 only if it's created by the Lua plugin (e.g., Listener.new()).
160 Creating new Listener tap types:
162 The Listener object is one of the more complicated ones.  When the Lua script
163 creates a Listener (using Listener.new()), the code creates and returns a tap
164 object.  The type of tap is based on the passed-in argument to Listener.new(),
165 and it creates a Lua table of the tap member variables.  That happens in
166 taps_wslua.c, which is an auto-generated file from make-taps.pl.  That Perl
167 script reads from a file called 'taps', which identifies every struct name
168 (and associated enum name) that should be exposed as a tap type.  The Perl
169 script then generates the taps_wslua.c to push those whenever the Listener
170 calls for a tap; and it also generates a taps.tx file documenting them all.
171 So to add a new type, add the info to the taps file (or uncomment an existing
172 one), and make sure every member of the tap struct you're exposing is of a
173 type that make-taps.pl has in its Perl %types and %comments associative
174 arrays.
176 Note on Lua versions:
178 Wireshark supports both Lua 5.1 and 5.2, which are defined as LUA_VERSION_NUM
179 values 501 and 502 respectively.  When exposing things into Lua, make sure to
180 use ifdef wrappers for things which changed between the versions of Lua.  See
181 this for details: http://www.lua.org/manual/5.2/manual.html#8.3
183 ==============================================================================
185 Defined Macros for Lua-API C-files:
187 WSLUA_MODULE - this isn't actually used in real C-code, but rather only
188 appears in C-comments at the top of .c files.  That's because it's purely used
189 for documentation, and it makes a new section in the API documentation.
191 For example, this appears near the top of the wslua_gui.c file:
193     /* WSLUA_MODULE Gui GUI support */
195 That makes the API documentation have a section titled 'GUI support' (it's
196 currently section 11.7 in the API docs).  It does NOT mean there's any Lua
197 table named 'Gui' (in fact there isn't).  It's just for documentation.
198 If you look at the documentation, you'll see there is 'ProgDlg', 'TextWindow',
199 etc. in that 'GUI support' section.  That's because both ProgDlg and
200 TextWindow are defined in that same wslua_gui.c file using the
201 'WSLUA_CLASS_DEFINE' macro. (see description of that later)  make-wsluarm.pl
202 created those in the same documentation section because they're in the same c
203 file as that WSLUA_MODULE comment.  You'll also note the documentation
204 includes a sub-section for 'Non Method Functions', which it auto-generated
205 from anything with a 'WSLUA_FUNCTION' macro (as opposed to class member
206 functions, which use the 'WSLUA_METHOD' and 'WSLUA_CONSTRUCTOR' macros).
208 WSLUA_ATTRIBUTE - this is another documentation-only "macro", only used within
209 comments.  It makes the API docs generate documentation for a member variable
210 of a class, i.e. a key of a Lua table that is not called as a function in Lua,
211 but rather just retrieved or set.  The 'WSLUA_ATTRIBUTE' token is followed by
212 a 'RO', 'WO', or 'RW' token, for Read-Only, Write-Only, or Read-Write. (ie,
213 whether the variable can be retrieved, written to, or both)  This read/write
214 mode indication does not appear to be actually used for documentation
215 currently, however.  After that comes the name of the attribute, which must be
216 the class name followed by the specific attribute name. 
218 Example:
220     /* WSLUA_ATTRIBUTE Pinfo_rel_ts RO Number of seconds passed since beginning of capture */
224 WSLUA_FUNCTION - this is used for any global Lua function (functions put into
225 the global table) you want to expose, but not for object-style methods (that's
226 the 'WSLUA_METHOD' macro), nor static functions within an object (that's
227 WSLUA_CONSTRUCTOR).  Unlike many of the macros here, the function name must
228 begin with 'wslua_'.  Everything after that prefix will be the name of the
229 function in Lua.  You can ONLY use lower-case letters and the underscore
230 character in this function name.  For example 'WSLUA_FUNCTION
231 wslua_get_foo(lua_State* L)' will become a Lua function named 'get_foo'.
232 Documentation for it will also be automatically generated, as it is for the
233 other macros.  Although from a Lua perspective it is a global function (not in
234 any class' table), the documentation will append it to the documentation page
235 of the module/file its source code is in, in a "Non Method Functions" section.
236 Descriptive text about the function must be located after the '{' and optional
237 whitespace, within a '\*' '*\' comment block on one line.
239 Example:
241     WSLUA_FUNCTION wslua_gui_enabled(lua_State* L) { /* Checks whether the GUI facility is enabled. */
242         lua_pushboolean(L,GPOINTER_TO_INT(ops && ops->add_button));
243         WSLUA_RETURN(1); /* A boolean: true if it is enabled, false if it isn't. */
244     }
246 WSLUA_CLASS_DEFINE - this is used to define/create a new Lua class type (i.e.,
247 table with methods).  A Class name must begin with an uppercase letter,
248 followed by any upper or lower case letters but not underscores; in other
249 words, UpperCamelCase without numbers.  The macro is expanded to create a
250 bunch of helper functions - see wslua.h.  Documentation for it will also be
251 automatically generated, as it is for the other macros.
253 Example: 
255     WSLUA_CLASS_DEFINE(ProgDlg,NOP,NOP); /* Manages a progress bar dialog. */
257 WSLUA_CONSTRUCTOR - this is used to define a function of a class that is a
258 static function rather than a per-object method; i.e., from a Lua perspective
259 the function is called as 'myObj.func()' instead of 'myObj:func()'.  From a
260 C-code perspective the code generated by make-reg.pl does not treat this
261 differently than a WSLUA_METHOD, the only real difference being that the code
262 you write within the function won't be checking the object instance as the
263 first passed-in argument on the Lua-API stack.  But from a documentation
264 perspective this macro correctly documents the usage using a '.' period rather
265 than ':' colon.  This can also be used within comments, but then it's
266 '_WSLUA_CONSTRUCTOR_'.  The name of the function must use the Class name
267 first, followed by underscore, and then the specific lower_underscore name
268 that will end up being the name of the function in Lua.
270 Example:
272     WSLUA_CONSTRUCTOR Dissector_get (lua_State *L) {
273         /* Obtains a dissector reference by name */
274     #define WSLUA_ARG_Dissector_get_NAME 1 /* The name of the dissector */
275         const gchar* name = luaL_checkstring(L,WSLUA_ARG_Dissector_get_NAME);
276         Dissector d;
278         if (!name)
279             WSLUA_ARG_ERROR(Dissector_get,NAME,"must be a string");
281         if ((d = find_dissector(name))) {
282             pushDissector(L, d);
283             WSLUA_RETURN(1); /* The Dissector reference */
284         } else
285             WSLUA_ARG_ERROR(Dissector_get,NAME,"No such dissector");
286     }
289 WSLUA_METHOD - this is used for object-style class method definitions.  The
290 documentation will use the colon syntax, and it will be called as
291 'myObj:func()' in Lua, so your function needs to check the first argument of
292 the stack for the object pointer.  Two helper functions are automatically made
293 for this purpose, from the macro expansion of WSLUA_CLASS_DEFINE, of the
294 signatures 'MyObj toMyObj(lua_State* L, int idx)' and 'MyObj
295 checkMyObj(lua_State* L, int idx)'.  They do the same thing, but the former
296 generates a Lua Error on failure, while the latter does not.
298 Example:
300     WSLUA_METHOD Listener_remove(lua_State* L) {
301         /* Removes a tap listener */
302         Listener tap = checkListener(L,1);
303         if (!tap) return 0;
304         remove_tap_listener(tap);
305         return 0;
306     }
309 WSLUA_METAMETHOD - this is used for defining object metamethods (ie, Lua
310 metatable functions).  The documentation will describe these as well, although
311 currently it doesn't specify they're metamethods but rather makes them appear
312 as regular object methods.  The name of it must be the class name followed by
313 *two* underscores, or else it will not appear in the documentation.
315 Example:
317     WSLUA_METAMETHOD NSTime__eq(lua_State* L) { /* Compares two NSTimes */
318         NSTime time1 = checkNSTime(L,1);
319         NSTime time2 = checkNSTime(L,2);
320         gboolean result = FALSE;
322         if (!time1 || !time2)
323           WSLUA_ERROR(FieldInfo__eq,"Data source must be the same for both fields");
325         if (nstime_cmp(time1, time2) == 0)
326             result = TRUE;
328         lua_pushboolean(L,result);
330         return 1;
331     }
334 WSLUA_ARG_ - the prefix used in a #define statement, for a required
335 function/method argument (ie, one without a default value).  It is defined to
336 an integer representing the index slot number of the Lua stack it will be at,
337 when calling the appropriate lua_check/lua_opt routine to get it from the
338 stack.  The make_wsluarm.pl Perl script will generate API documentation with
339 this argument name for the function/method, removing the 'WSLUA_ARG_' prefix.
340 The name following the 'WSLUA_ARG_' prefix must be the same name as the
341 function it's an argument for, followed by an underscore and then an ALLCAPS
342 argument name (including numbers is ok).  Although this last part is in
343 ALLCAPS, it is documented in lowercase.  The argument name itself is
344 meaningless since it does not exist in Lua or C code.
346 Example: see the example in WSLUA_CONSTRUCTOR above, where
347 WSLUA_ARG_Dissector_get_NAME is used.
350 WSLUA_OPTARG_ - the prefix used in a #define statement, for an optional
351 function/method argument (ie, one with a default value).  It is defined to an
352 integer representing the index slot number of the Lua stack it will be at,
353 when calling the appropriate lua_check/lua_opt routine to get it from the
354 stack.  The make_wsluarm.pl Perl script will generate API documentation with
355 this argument name for the function/method, removing the 'WSLUA_OPTARG_'
356 prefix.  The rules for the name of the argument after the prefix are the same
357 as for 'WSLUA_ARG_' above.
359 Example:
361     #define WSLUA_OPTARG_Dumper_new_FILETYPE 2 /* The type of the file to be created */
364 WSLUA_MOREARGS - a documentation-only macro used to document that more
365 arguments are expected/supported.  This is useful when the number of
366 argumeents is not fixed, i.e., a vararg model.  The macro is followed by the
367 name of the function it's an argument for (without the 'wslua_' prefix if the
368 function is a WSLUA_FUNCTION type), and then followed by descriptive text.
370 Example:
372     WSLUA_FUNCTION wslua_critical( lua_State* L ) { /* Will add a log entry with critical severity*/
373     /* WSLUA_MOREARGS critical objects to be printed    */
374         wslua_log(L,G_LOG_LEVEL_CRITICAL);
375         return 0;
376     }
379 WSLUA_RETURN - a macro with parentheses containing the number of return
380 values, meaning the number of items pushed back to Lua.  Lua supports mutliple
381 return values, although Wireshark usually just returns 0 or 1 value.  The
382 argument can be an integer or a variable of the integer, and is not actually
383 documented.  The API documentation will use the comments after this macro for
384 the return description.  This macro can also be within comments, but is then
385 '_WSLUA_RETURNS_'.
387 Example:
389     WSLUA_RETURN(1); /* The ethernet pseudoheader */
392 WSLUA_ERROR - this C macro takes arguments, and expands to call luaL_error()
393 using them, and returns 0.  The arguments it takes is the full function name
394 and a string describing the error.  For documentation, it uses the string
395 arguement and displays it with the function it's associated to.
397 Example:
398     if (!wtap_dump_can_write_encap(filetype, encap))
399         WSLUA_ERROR(Dumper_new,"Not every filetype handles every encap");
402 WSLUA_ARG_ERROR - this is a pure C macro and does not generate any
403 documentation.  It is used for errors in type/value of function/method
404 arguments.
406 Example: see the example in thr WSLUA_CONSTRUCTOR above.
409 ==============================================================================
411 Memory management model:
413 Lua uses a garbage collection model, which for all intents and purposes can
414 collect garbage at any time once an item is no longer referenced by something
415 in Lua.  When C-malloc'ed values are pushed into Lua, the Lua library has to
416 let you decide whether to try to free them or not.  This is done through the
417 '__gc' metamethod, so every Wireshark class created by WSLUA_CLASS_DEFINE must
418 implement a metamethod function to handle this.  The name of the function must
419 be 'ClassName__gc', where 'ClassName' is the same name as the class.  Even if
420 you decide to do nothing, you still have to define the function or it will
421 fail to compile - as of this writing, which changed it to do so, in order to
422 make the programmer think about it and not forget.
424 The thing to think about is the lifetime of the object/value.  If C-code
425 controls/manages the object after pushing it into Lua, then C-code MUST NOT
426 free it until it knows Lua has garbage collected it, which is only known by
427 the __gc metamethod being invoked.  Otherwise you run the risk of the Lua
428 script trying to use it later, which will dereference a pointer to something
429 that has been free'd, and crash.  There are known ways to avoid this, but
430 those ways are not currently used in Wireshark's Lua API implementation;
431 except Tvb and TvbRange do implement a simple model of reference counting to
432 protect against this.
434 If possible/reasonable, the best model is to malloc the object when you push
435 it into Lua, usually in a class function (not method) named 'new', and then
436 free it in the __gc metamethod.  But if that's not reasonable, then the next
437 best model is to have a boolean member of the class called something like
438 'expired', which is set to true if the C-code decides it is dead/no-longer-
439 useful, and then have every Lua-to-C accessor method for that class type check
440 that boolean before trying to use it, and have the __gc metamethod set
441 expired=true or free it if it's already expired by C-side code; and vice-versa
442 for the C-side code.
444 In some cases the class is exposed with a specific method to free/remove it,
445 typically called 'remove'; the Listener class does this, for example.  When
446 the Lua script calls myListener:remove(), the C-code for that class method
447 free's the Listener that was malloc'ed previously in Listener.new().  The
448 Listener__gc() metamethod does not do anything, since it's hopefully already
449 been free'd.  The downside with this approach is if the script never calls
450 remove(), then it leaks memory; and if the script ever tries to use the
451 Listener userdata object after it called remove(), then Wireshark crashes.  Of
452 course either case would be a Lua script programming error, and easily
453 fixable, so it's not a huge deal.
455 ==============================================================================