Supported Hardware
Package Content
Server Install
Client Install
Gateway Install
Tech Info
PDU format
Bugs / Todo
Related Links

Jump to Vim Home Page

Project SMSLink - Changelog

smslink-0.56b-3 (October 2nd, 2006)

  • Fixed multiple send of DB queued messages by limiting the number of concurrent OBC child processes to 1 (instead of 'ngsmdevs'). Since the queue items are not locked during processing, the same item could be selected by more than one child process. Bug reported by Tony S. Sykes. The current fix is not optimal. I should implement a proper locking mechanism, and return to multiple concurrent OBC child processes to maximize throughput.
  • Memory corruption fix (string overflow through unchecked strcpy() in db_outbox_check()) in the processing of messages queued in the 'outbox' DB table (reported by Gabriele Zappi). Added a few missing terminating NULLs in other calls to strncpy().
  • Improved the output of the 'qstat' command by requesting the 'stored' column in formatted form (in db_list_queue()).
  • Integrated a fix contributed by Peter Forgac that restores compatibility with FreeBSD 6 (sigignore() replaced with signal(...,SIG_IGN) in ./server/mbchecker.c). Also added a comment in the server Makefile to use the FREEBSD platform when compiling on FreeBSD 6.1 instead of FREEBSD5.
  • Integrated changes contributed by Tony S. Sykes. They add proper support for MySQL v5.0. Bumped database schema version from 4 to 5. Also created a small SQL script to automate the migration of an existing installation to schema version 5. Placed it in a new ./varia/database directory. Moved the database creation script (database.sql) there as well.
  • Added support for the Ericsson F251m GSM modem (in ./server/gsmcaps). Contributed by Miguel Armas.
  • Cosmetic update to fatal() function (./server/stuff.c).
  • Bumped sms2mailgw version to 0.20b.
  • Plugged a memory leak in mailbox_run() (./server/gw_stuff.c). The variable called "iboxentry" got allocated but never freed. Also added a free() call for two variables in sms2mailgw.c, but those are mostly cosmetic, since that code is never reached.

smslink-0.56b-2 (April 6th, 2006)

  • Added PID file generation and removal code to the server module, in order to ease integration with System V init scripts as used under SuSE linux (among others). PID file name would be /var/run/ by default, but can be set through a new command line option (-i). The new option is compatible with the -f option. Man pages and online help adapted accordingly. Cosmetics.
  • Solved a bug in dumptodb() (in ./server/mbchecker.c), where 'cursor' could have been used uninitialised in the case of a MySQL connection failure (bug spotted by Tarmo Kuuse).
  • Fixed the bug that caused a segfault in resolve() (./server/smtp.c) on the x86_64 platform when called with a hostname in debug mode.
  • Fixed a major bug (missing {}'s around an 'if' block) and improved error checking in resolve() (./server/smtp.c) + some code readability improvements.
  • Solved a silly bug in db_outboxcheck() and file_outboxcheck() (./server/mbchecker.c), where 'gsm' was used before being initialized. It caused a segfault in backend_send_sms().
  • Added more debugging to the OBC list handling. In case of OBC cancellation, it will now output a syslog entry similar to the following:
    Mar  9 17:21:57 kermit sms_serv[6223]: OUTBOX check cancelled, <1> child procs already.
    Mar  9 17:21:57 kermit sms_serv[6223]: OBC list: Child #0: <6274>
  • Added the "skip" flag (requested by Maximo Cuadros), and adapted the gsmdevices(5) man page and template file accordingly. When specified, this flag requests that the device be skipped during inbox runs.
  • A fix provided by Marty Lee solves a bug where the "prog" spawned child would kill its parent "mbchecker" process through SIGCHLD when terminating.
  • I followed Marty Lee's suggestion and improved the INSERT query in dumptodb() in (./server/mbchecker.c).
  • Fixed a compilation problem on FreeBSD 5 in ./server/smtp.c (thanks to Piet Ruyssinck for alerting me to the problem and providing the bugfix).
  • Added preliminary support to the server makefile for interfacing sms_serv(1) with my new modem emulator ostrich(1) (through the hacked libmodem called "libmodememu" -- this work hasn't been released yet).
  • Increased (again) the value of PINLEN (now from 5 to 8). "Fluff" reported a problem due to the fact that his SIM card used a six-digit PIN code. I'm now adding an extra 2 -- hope this will be enough for a while.
  • Corrected a string sizing bug in translatemodname() (in ./server/gsmdevices.c).
  • Replaced the dump_string() debugging function in ./server/stuff.c with a vastly improved version. It now behaves as expected for any self-respecting hexdump (3 columns display: offset, hex codes, ascii equivalent). Adapted the Makefile accordingly.
  • Added PID file generation and removal code to the server module, in order to ease integration with System V init scripts as used under SuSE linux (among others). PID file name would be /var/run/ by default, but can be set through a new command line option (-i). Man pages and online help adapted accordingly. Cosmetics.
  • Solved the "can't move new inbox file - system() failed" crash (reported by Mark Pollock, Steven Delport and Johan Kotze) by removing the 'ignore' on SIGCHLD (in ./server/sms2mailgw.c). This prevented proper execution of the system() call on systems with more recent versions of glibc (and was unnecessary anyway).
  • Improved error checking in mailbox_run() (./server/gw_stuff.c).
  • Fixed a bug in mailbox_run() (./server/gw_stuff.c) that would lose the first line(s) of a multiline, non-mail inbox entry if it came after mail entries. Cosmetics.
  • Fixed the bug that caused a segfault in resolve() (./server/smtp.c) on the x86_64 platform when called with a hostname in debug mode.
  • Fixed a major bug (missing {}'s around an 'if' block) and improved error checking in resolve() (./server/smtp.c) + some code readability improvements.
  • Improved on-line help message in ./server/sms2mailgw.c.
  • Fixed a compilation problem on FreeBSD 5 in ./server/smtp.c (thanks to Piet Ruyssinck for alerting me to the problem and providing the bugfix).
  • Replaced the dump_string() debugging function in ./server/stuff.c with a vastly improved version (see server section for more details). Adds -lm to the gateway build.
  • Improved error reporting in the client (sendsms).
  • Added sample System V init scripts for SuSE in the new directory ./varia/scripts/SuSE.
  • Added the mail to sms forwarding trick contributed by Steven Delport (in a new directory ./contrib/mail2sms).
  • Fixed an ugly oversight in ./varia/database.sql (the DB creation script hadn't been updated to take all changes specific to schema ver. 4 into account). Thanks a lot to Marty Lee for spotting that one.

smslink-0.56b (June 11th, 2004)

  • Improved the "interactive interface" command parser behaviour in case of a "parse error". Once a "parse error" message has been emitted, the rest of the input buffer is now discarded, which avoids the need to press the [return] key several times to clear the buffer. This bug has been present since the first released version of SMSLink. I'm really glad I eventually got rid of it ;-) Beware: the solution to this bug might make the lexer dependent on the GNU version of lex (i.e. flex(1)).
  • Added support in the Makefile for a "debug-enabled" compilation of the lexer. Uncomment the line that defines the FLDEBUG variable to enabled it.
  • Added a "processed" column in the inbox table. This column is initially filled with 'n' by the sms_serv process, and is then supposed to be set to 'y' by the (user-supplied) external application that will further process incoming messages.
  • Added a "purge" command to the interactive interface, that removes sent messages from the outbox table and / or processed messages from the inbox table. This command is available only when the "db" backend is enabled. Purging processed messages from the outbox will only be possible provided the (user-supplied) external application that will further process incoming messages actually sets the "processed" column appropriately.
  • Added support for a prioritisation of queued items. Priorities by default range from 1 (highest) to 5 (lowest). Default priority is 3. The user is now able to select his/her message priority at submission time. Messages are listed and processed ordered by priority. This feature is most usefull in conjunction with the limit on messages processed per queue run ('-l' option). Added the "set prio", "show prio" and "clear prio" commands to the interactive interface. Adapted "qstat" output and on-line help accordingly. This feature had been requested by Andrew Goldschmidt. This feature required adding a new "priority" column to the outbox table. It works with both the "db" backend and the "file" backend (although only the "db" backend currently garantees FIFO ordering of the messages within any given priority).
  • Fixed a silly bug in dequalify(), affecting the determination of the DNS domain the server is working for.
  • Implemented a child process monitoring system, to avoid starting a second outbox check while the previous one is still running (typically seen with a tight '-o' loop and no '-l' option set). There is still room for improvement here, since the current technique doesn't make proper use of multiple GSM devices in parallel when available (more precisely, multiple child processes could be started in this case, but they might all process the same messages, meaning multiple send).
  • Added '-X' command-line option, to allow setting the name of the external program / script that should be called during inbox runs when the "prog" flag is set without needing to recompile the server.
  • Added support for Nokia 30 Connectivity Terminal and for Motorola A008 / 6288 (contributed by Nicki de Wet).
  • Corrected the set of defines for TPDU header fields in ./server/pdu.h. In previous versions, I misunderstood the ETSI specs and completely mixed-up headers from different PDU types (mainly SMS-SUBMIT and SMS-DELIVER). Those types are now properly identified, and all matching header fields are provided. Adapted usage in ./server/pdu.c accordingly. This change is purely cosmetic for now -- the actual values, once compiled, don't change.
  • Added '\t' to the list of characters that would be edited out by the trim() function (in ./server/stuff.c). Affects the processing of some parameters by the interactive interface parser and the handling of incoming messages.
  • Improved debugging info.
  • Adapted the man pages accordingly.
  • Fixed a silly bug in dequalify(), affecting the determination of the DNS domain the server is working for.
  • Improved debugging info.
  • Improved the error reporting in the client, in the case where the client requests server-side queueing of the message and the server doesn't support that feature. The client used to report a plain "sending failed". It will now report the real cause ("queueing disabled") and return with exit code 105.
  • Added support for the queued item priority feature to the client ('-e' option).
  • Re-arranged client on-line help output ('-h' option).
  • Adapted the man pages accordingly.

smslink-0.55b-2 (October 10th, 2003)

  • In ./server/dbaccess.c and ./server/mbchecker.c, corrected a bug where the "outbox.stored" database column would get reset to NOW() on update. Thanks to Andrew Goldschmidt for pointing it out.
  • Fixed a compilation error on FreeBSD 4.8 due to some missing includes. Thanks to Nicki de Wet for the patch.

smslink-0.55b (August 8th, 2003)

  • Outbound messages queueing support. Queued messages are processed by an "outbox check" child process, started at (admin-settable) interval by the server. Contributed by Ing. Andrea Vettori.
  • Two different queueing method are provided: through the use of files or in a back-end database. The implementation design is modular, so adding new queueing methods in the future should be easy.
  • New commands have been added to the server that take advantage of this queueing feature: in addition to the usual send, you can now also use the new queue and post. queue will simply store the message in the outbound queue for later delivery, while post will attempt a single immediate "send". If this fails, the message is queued for later delivery.
  • The queueing mechanism now supports queued items obsolescence. The administrator can set a maximum number of times each queue item will undergo an attempted send. When all allowed attempts have failed, the item will be removed from the queue (files are removed, database entries are just flagged "failed"), and an email message is sent to the administrator ("postmaster" by default).
  • Two new commands in the interactive interface allow for the outbound queue to be managed. Those are qstat (lists queue entries, their IDs and queue run count) and qdel (removes an entry from the queue).
  • The server module now features support for a MySQL back-end database. This support is related to, but independant of the queueing support. A new db option can be included in the /etc/gsmdevices file to indicate that incoming messages should be stored in the DB (you can use any combination of inbox, prog and db options). If the outbox check feature is enabled (-o server command-line option) and DB access is enabled (valid MySQl credentials), then the DB will be polled for outgoing messages (irrespective of whether or not queueing is enabled -- based on the principle that the database instance can be managed entirely outside of SMSLink). Contributed by Ing. Andrea Vettori.
  • Warning: For those of you already using an earlier pre-release version of sms_serv 0.55b, please note that the table layout of the database has slightly changed since then. Please refer to the provided database creation script (./varia/database.sql) for details on the new layout.
  • The smsstore database now features a new schema table that will hold a schema version number. This schema version will be checked at server startup to make sure the database layout is in-line with the server expectations.
  • DB instances can be setup on the same host where the SMSLink server runs, or anywhere on the network.
  • A new mode has been added: init. In your /etc/gsmdevices file, use either poll, dd or init. The purpose of init is to fully initialize the specified GSM module at server startup (the server will feed it all "configuration" AT+ commands). Then, during message processing (incoming or outgoing), only those commands will be issued that may vary for each user request. This speeds up the message delivery considerably, of course, but at the cost of some robustness: when using init mode, the server won't be able to recover from a power-cycle on the GSM device. Contributed by Ing. Andrea Vettori.
  • More command-line options. Most features that used to be set at compile-time through #define can now be set at runtime through command-line options. Have a look at sms_serv(1) or type sms_serv -h for more details.
  • Implemented the stats command in the interactive interface. Reports on the number of messages sent and received and the amount of failed attempts since the server is up. And all this per attached device, of course.
  • Added a long option to the devicelist command in the interactive interface. Displays the full information for each device, including the driver name and all counters.
  • In earlier pre-releases of sms_serv, dl l used to also display the PIN and PUK code. I'm now hiding this for security reasons, and will re-enable it when an admin enable mode will have been implemented.
  • File suffix and port number command-line options support. This allows you to run multiple instances of the server on the same host. Contributed by Ing. Andrea Vettori.
  • Preliminary support for the default GSM alphabet (on the GSM side) and various ISO charsets on the server side. This should allow for correct processing of non-ASCII7 foreign characters (such as found in french, german, etc.). Works both for sending and receiving (beware: this feature is meaningfull in PDU mode only). Currently only supports ISO-8859-1 and ISO-8859-15, but it's easy to add more charsets.
  • Warning: Changed the format of the /etc/gsmdevices file. Added a new field called PINpause. I noticed that the amount of time required by the GSM network to process a login request (what happens "behind the scene" when you provide your PIN code) could vary wildly from one provider to the next. So I made this configurable. See gsmdevices(5) for more details.
  • Added support for <numplan> #C8.
  • Expanded the #defined "PUKLEN" value to 16 chars (in ./server/sms_serv.h), as a user reported using a 15-char long PUK string.
  • Started work on solving Victor Tan's problem (parallel access to multiple devices when all of them are in dd mode). Also made some generic improvements to dd_spawn() (memory allocation and cleanup for struct symbols, error reporting). Also found out that, as it is currently implemented, the dd mode will only support the send command (what about post and queue ?). Added the dd_busy field in the struct gsms_def - modified gsmdevcpy() accordingly.
  • Worked on solving a weakness in mbparse() (in ./server/mbchecker.c), where only the first line of a multi-line message would be saved (due to an earlier, misguided, design decision). The parsing code should now allow for multiple [<CR>]<LF> characters in the text of the message. Those will then be trimmed out to be replaced by spaces (in order for the incoming messages to be saved on a single line in the inbox file). Problem resolution contributed by Marcel P..
  • New end-of-string detection strategy in packed8toascii7(): added a <tpudl> parameter, moved the "trailing '@'" check within packed8toascii7().
  • Fixed broken support for FreeBSD 4.8 and added support for FreeBSD 5.0 with the help of Greg May. Added the GNU getopt code in the (new) ./libs directory, for use on those platforms that don't use glibc. Added two variables IEXTRA and LEXTRA that make it easier for the user to specify extra include and library paths when needed (e.g. when the MySQL libs are in a non-standard location).
  • Code cleanup in the GSM modem dialogue (removed much duplication, made it a lot more modular). Implemented on the whole code the technique shown by Ing. Andrea Vettori.
  • Improved Makefile readability. Altered CFLAGS handling in the Makefiles. Makes it possible to get a debug build by first exporting CFLAGS="-g" and then running make.
  • Added support for the following hardware:
  • Now shipping version 0.16b.
  • Warning: For those already using version 0.12b or higher: some of the gateway module command-line options were changed to keep them in line with the equivalent options on the server module (-r became -M; -D became -F). Please adapt your scripts accordingly.
  • Added the --mbchkinterval command-line parameter to allow this daemon to synchronize with sms_serv(1).
  • Replaced the old (incorrect) domain determination strategy that involved NIS by a more technically correct approach based on DNS only. Added the --defaultdomain= command-line option for easy override.
  • Added the --smtprelay= command-line option for added flexibility in mail routing setup.
  • In ./server/gw_stuff.c (now in ./server/smtp.c), in send_mail() function, replaced all <lf> by <cr><lf> sequences in the dialog with the SMTP server, as per RFC 822bis, section 2.3 (see for details). Caused problems when talking to qmail. Thanks a lot to Nathan Thomas for letting me know.
  • Added a call to dequalify() on variable localhost to prevent the domain name to appear twice in the From: address.
  • Moved everything email-related to ./server/smtp.[ch] (to be able to share it with the server module).
  • Corrected a bug that prevented multi-line inbox entries from being successfully processed. Those are now supported, whether they be mail or non-mail entries.
  • In the Makefile, removed 2 useless libs from the link line of the sms2mailgw(1) module (-lnsl & -lresolv).
  • Updated man page accordingly.
  • Now shipping version 0.22b.
  • Adds support for the new server-side commands (post and queue). The desired command can be selected on the client side by a command-line option. See sendsms(1) for details.
  • Added support for FreeBSD 5.0 (contributed by Greg May).
  • Replaced outdated use of sys_errlist[] and sys_nerr by calls to strerror(). Thanks to Greg May for reporting the bug (spotted on RH 9.0).
  • Improved Makefile readability.
  • Updated man page.
  • Now shipping version 0.04b of gsmts0338(1).
  • Added support for default GSM alphabet + command-line option to select the local character set.
  • Added handling of new <tpudl< param to packed8toascii7() (for better support of the trailing '@' case). Play with it through the -l command-line option.
  • Updated man page.
  • Added 2 new utilities: encode_pdu(1) [shipping version 0.03b] and decode_pdu(1) [shipping version 0.05b].
  • Adapted ./pdu-tools/Makefile to better handle the dependency beween the tools and some objects from the server directory.
  • In ./varia, an SQL script is provided (called database.sql) that can be used to create the back-end MySQL database and its related tables.
  • Included a new GUI-based Win32 VB client contributed by Alex Cooper. Created a directory called SMS-VB below ./contrib to keep the sources and the README file.

smslink-0.54b-8 (December 10, 2001)

  • In ./server/pdu.c, added proper support for a variety of numplans, usually seen in messages received from internet websites. Thanks a ton to Thomas Gutzler for all the data he gathered for me, and for his great help in testing the new features. For more details on the actual numplans now supported, their meaning or the sites they were coming from, please refer to my new PDU format support page.
  • Also in ./server/pdu.c, modified the numplan switch cases to hex values. Made the <OA> byteswap conditional to <numplan> value. Fixed a bug where the msg->fromgsm string was not always properly terminated.
  • In ./server/dd.c, ./server/mbchecker.c and ./server/server.y, replaced calls to blopen_mdm_line() by calls to lopen_mdm_line() (those functions are exported in the libmodem API). Advantage being that this version uses the max. speed supported by the device by default (the one defined in /etc/modems). I'm now down to 11 secs per SMS in "poll,fast" mode.


  • Upgraded to version 0.19b. For the mods, see below.
  • Added a ./pdu-tools directory, containing the gmsts0338(1) utility. This small program allows you to convert strings to and from the ETSI GSM TS 03.38 alphabet (the one used in the PDU format). The ./pdu-tools directory will be used to store all utilities that could help in further developping support for the various features and quircks of the PDU format. To compile and install, just make; make install, and for usage info, man gsmts0338.

sendsms-0.19b (October 8, 2001)

  • Implemented a finer granularity in the acquisition loop by moving to usleep(). Allows the client to sleep by slices of 100 millisecs (instead of a full second). The overall timeout value for each step of the dialogue with the server wasn't altered. A bit heavier on the CPU, but offers the promise of small performance gains against current versions of the server. Will be required to take advantage of the speed improvement that will be featured in the next minor release of the server.

smslink-0.54b-7 (September 27, 2001)

  • Altered the "OK string" and "line separator" fields in the driver file (/etc/gsmcaps) for the SM20, in order to properly support "fast" mode on it. Thanks to Paul Schaap for his debug traces ;-).
  • In decode_pdu() (./server/pdu.c), added a debug level that would accept any numplan, print a warning and go ahead, e.g. for numplan #85 [reserved] (requested by Thomas Gutzler). To activate the feature, run the server with "-d 16" switch (or plain "-d", of course). Changed numplan processing to a switch structure to make it easier supporting more numplans in the future.


  • Upgraded to version 0.18b. For the mods, see below.

sendsms-0.18b (September 24, 2001)

  • Complete re-engineering of the main function implementing the dialogue between client and server (get_gsm_answer()). Thanks to this, the average sending time is now down to between 14" and 16" against a server running in "poll,fast" mode, and 11" against a server running in "dd,fast" mode. A significant improvement in performance is also felt when sending through a server using the regular (= "slow") mode.
  • Fixed the dialogue with the server to also accept as successful the message sent out by a server in "dd" mode. Silly oversight of mine. Thanks to Paul Schaap for the fix.
  • Since the distinction between slurp_n_catch() and get_gsm_answer() was completely useless and artificial, I merged both functions into get_gsm_answer().
  • A few new command-line options: -g for debugging, -r for reporting (the device name used for sending and the message ID on the server when available [thanks to Paul Schaap for the idea]), -p for the connection port on the server, when a non-standard one is used.
  • I changed the way the communication port is handled. If a port is requested via the -p command-line option, that one is used. If not, the program attempts to get the port number through a call to getservbyname() for service "sms". Only when this fails is the compiled-in default used.
  • Made the allocation of the sendlog buffer sully dynamic. No more artificial limit on how long the dialogue with the server can be.
  • Improved error reporting.
  • Updated the man page accordingly.

smslink-0.54b-6 (May 9, 2001)

  • Added a 20 secs pause in send_sms() (./server/server.y), mbcheck() (./server/mbchecker.c) and dd_init() (./server/dd.c) after initial PIN processing when using the "fast modem response" mode, to try and solve the "+CMS ERROR: 515" message I was getting on the WMOD2B module. CMS 515 means the module is still busy processing the last command, so it looks like "fast" mode was a bit too fast indeed.
    This pause will only hit you in "fast" mode, and then only on the first access to the module after it underwent a power cycle. If this bugs you and you feel it's not necessary with the brand you're using, give me a note and I'll isolate that behaviour through a driver flag.
  • Added cpl_list de-allocation code in send_sms() (./server/server.y) -- back-ported from the upcoming 0.55b.
  • Modified dd_init() (./server/dd.c) to also use the new get_gsm_resp() calls and related cpl_list structure when checking for the PIN code.
  • Modified the "OK string" and "line seperator" fields in the gsmcaps file for devices of type FA1, FA2 and GENSM2 after a live test.

smslink-0.54b-5 (May 5, 2001)

  • Solved a bug in send_sms() for GSM devices having SUBPROMPT_IN_CMGS when using "fast modem response" mode.

smslink-0.54b-4 (May 5, 2001)

  • Improved handling of the values returned by the AT+CREG? command in send_sms(), mbcheck(), dd_clear_msgs() and dd_send_sms(). The <mode> field is now properly ignored (the server INSTALL page has been modified to recommend setting the mode to disabled), and the <stat> field is now analysed and reported for easier troubleshooting. Parsing of the +CREG: answer is implemented in getregstat(), in server/serv_stuff.c.
    Thanks to Norbert Lataille for bringing this issue to my attention.

smslink-0.54b-3 (April 6, 2001)

  • Warning: I modified /etc/gsmcaps format to include the "modem_okay" string and the line separator character(s). Please copy the new file manually in place.
    Adapted translatemodname() and gsmdevcpy() to handle those new fields. Modified the man page accordingly.
  • In send_sms() and mbcheck(), replaced the call to get_gsm_answer() by one to get_gsm_resp() in order to allow for detection of a "multiple choice" of catch phrases.
  • In server/serv_stuff.c, replaced the char * parameter by a cpl_list parameter in get_gsm_resp(), get_gsm_answer() and get_gsm_fast().
  • Added all needed functions to handle this new cpl_list structure in server/serv_stuff.c.
  • In server/stuff.c, added a function spchar_pp() that translates special characters in printf() format as read from /etc/gsmcaps to their appropriate ascii value.
  • In server/sms_serv.c, added a test for negative debug level values, and generated a log entry when the debug is active.
  • In server/accessctrl.c, removed an old inconsistency where debug messages were sent to stdout instead of stderr.

smslink-0.54b-2 (March 30, 2001)

  • Added hexdump of modem answer in get_gsm_sleep() and get_gsm_fast() to help debug problems with "fast modem response" mode on some devices. Moved dump_string() from mbchecker.c to stuff.c. Added a separate debug level to support it (DEBUG_HEXDUMP).

smslink-0.54b (March 12, 2001)

(Note: this release was mostly dedicated to merging huge changes brought by Andrew Worsley, namely the support for the Ericsson GM-12, a "dedicated daemon" mode that can speed up processing of incoming messages, a "fast modem response" mode that can speed up modem dialog, the ability to feed incoming messages to some arbitrary external program / script, device-level flags controlling which of those features are enabled or not, etc. I wanted to aknowledge those here. They are a tremendous asset to this project. All of those changes will be marked with [Andrew] in the list below. Some additional changes were brought by others - those will be attributed in the log below.)
  • Added support for the Ericsson GM-12 (and GM-22 - same driver - that change was also submitted by Ing. Andrea Vettori) [Andrew].
  • Modified /etc/gsmdevices format by adding an optional field that would hold a list of comma separated flags used to enable or disable each of the new features on a per-device level. Adapted demangle_gsm_entry() to take it into account [Andrew].
  • Added a new "dedicated daemon" mode (handled by the functions in server/dd.c and hooks in main()) meant to speed up processing of incoming messages in the cases where those have higher priority than outgoing ones, or where one of the devices hooked to a server that has many can be dedicated to handling incoming messages. In this case, the master daemon will spawn a child process dedicated to listening to the device. If all other devices are busy, the dedicated one(s) can also be used to send [Andrew].
  • Modified the dumptofile() function so that it is now possible to feed incoming messages to arbitrary external programs / scripts to be further processed. A sample script is provided that would forward all incoming messages to a predefined mailbox (varia/scripts/ A device-level flag controls whether the message has to be stored in the inbox, fed to a program, or both [Andrew].
  • Modified get_gsm_answer() function to exit early as soon as a catch-phrase is received. This speeds up the dialog with the modem considerably, by avoiding a useless wait() call. Use of this feature, dubbed "fast modem response", is controlled by a device-level flag (fast) [Andrew].
  • Modified mbcheck() to read all messages from the SIM (and then delete them) instead of just reading the unread ones. Purpose of it being to make sure that no half-processed message may get stuck in the SIM memory, thereby clogging it and preventing further message reception [Andrew]. I isolated this feature on a device-level flag (r4).
  • Added a global variable to define the concept of "debug level". Isolated logging of modem dialog on 2 of those levels [Andrew]. I used this opportunity (triggered by Andrew's advice) to move to another debug level all the debug info that was previously controlled by compile-time defines.
  • Added a few commands to the interactive interface command language to allow control of this debug level ('show debug', 'set debug = x', 'clear debug'). Impact limited to the current session, of course. Modified on-line help accordingly.
  • Added command-line parameters to handle (for the mean time) the setting of the debug level. I improved on Andrew's input by also merging part of Ing. Andrea Vettori's upcoming patch, thereby using GNU getopt() function to parse the command-line. This include support for long and short version of the options.
  • Modified mbparsePDU() to continue processing when dealing with an invalid PDU string (to remove it from the SIM) [Andrew].
  • Modified packed8toascii7() so that it would return in error in case a non-ascii7 character is found [Andrew].
  • Added function trChar() in stuff.c [Andrew].
  • Adapted all the man pages accordingly.
  • Eliminated a slew of gcc warnings in server.y.
  • In server.y, mbchecker.c and dd.c, modified the routine for the selection of a new PIN in the case of a failure that brings us to the use of the PUK. Now tries to use the stored PIN value, instead of randomly choosing a new one. Thanks to Shay Kalderon for showing me the light.
  • Fixed the "driver flags" for the WMOD2B (I just got one :-), kudos to Shay). Contrary to what was believed, it does have a subprompt. If this was not the case for earlier versions of the command parser (the one I have is using version 4.10), please let me know.
  • Corrected a minor error in the gsmcaps entry that Andrew provided for the GM-12 (HAS_CSDH_1 should be set to '0' - N/A since this model doesn't support text-mode).


  • Added a global variable to define the concept of "debug level". Moved to that mechanism all the debug info that was previously controlled by compile-time defines.
  • Added command-line parameters to handle (for the mean time) the setting of the debug level. Used GNU getopt() function to parse the command-line, to match what was done in the server. This include support for long and short version of the options.

smslink-0.52b-3 (February 13, 2001)

  • Compilation of the command-line client was broken for the Solaris platform. Thanks to Cristian Llaras for noticing the problem and providing the fix.

smslink-0.52b-2 (December 30, 2000)

  • Improved the driver definitions for the Wavecom devices (and some Falcom ones whose core is Wavecom-based). Only the /etc/gsmcaps file was modified. No change in the code. Thanks to David Martinez from Wavecom France for his excellent technical advice.
    Warning: some Wavecom devices were renamed (what I thought to be a zero was in fact an "Oh", as in WMO2). If you're using one such device, please make sure to modify your /etc/gsmdevices according to the new device codes defined in /etc/gsmcaps when upgrading.

smslink-0.52b (November 30, 2000)

  • Just incremented the server module version to reflect the package version. No change in the code.


  • Port to the Win32 + Cygwin1 platform. Requires the use of the latest nightly snapshot of the Cygwin libs, but it works. Click here for detailed install instructions. Due to some bug in the cygwin1.dll, the client program will exit with an error when the SMS server parameter is given as an IP address (using hostnames works fine, provided DNS is properly configured on the client, of course). This has been reported and should be fixed in some future snapshot of the Cygwin libs.
    Update: this bug has been fixed in the nightly snapshot released Dec. 1st. Please install cygwin-inst-20001201.tar.bz2 or later. Thanks a lot to Corinna Vinschen for her prompt reaction.
  • Added a new contrib/ directory in the project distribution file. It currently contains two different contributed native Win32 clients.
    The first one, called ClientSMS is GUI-based and requires Visual Basic to compile. I've not been able to evaluate it yet. Contributed by Dimitri Bellini.
    The second, called send_sms, is command-line based and requires Borland C++ to compile. It might compile under other Windows-based C++ compilers. I tested it, and it works very well, being actually faster than the native client (I'll sure have things to learn, here !). Contributed by Melle Sprenger.
    Huge thanks to both of them.
  • For a discussion of the various Win32 clients requirements and their raison d'être, please read this bit.

smslink-0.51b (November 27, 2000)

  • Added support for the Siemens S25 / S35 GSM modules. Contributed by Thomas Omerzu. Those models only support PDU-mode.
  • Finalized PDU-mode support: PDU-mode SMS reception is now working (tested on the FA1, GENSM2 and PCFF900). Please test it on yours as well.
  • Preliminary support for the "Option FirstFone GSM 900 PCcard". Kudos to Bernard Willemot for lending me the hardware. Reception works fine both in text and PDU mode. Sending in text mode works, but sometimes returns with an error even though the message was successfully sent. Sending in PDU mode behaves the same, but what's more, the destination phone will get garbage.
    Support for this hardware lead me to always quote the PIN code when sent to the devices (in sendsms() and mbcheck()). Should be closer to the standard -- I just hope it doesn't break support for any other model. Please test and let me know if it does.
  • WARNING: Please upgrade your /etc/gsmcaps file with the one provided in this release, as the capacity matrix was changed for all previously supported models.
    Failure to do so might affect text-mode reception.

smslink-0.50b-2 (November 10, 2000)

  • Added support for the "Ericsson F151s Business" mobile phone (with FD10 Data Adaptor). No change to the code, just an updated version of /etc/gsmcaps. Thanks to Dimitri Bellini for his help in making this work.

smslink-0.50b (November 3, 2000)

  • Port to the FreeBSD platform (contributed by Stanley Hopcroft).
  • Added a signal handling function for SIGCHLD that would reap the exit status of child processes and prevent zombie formation (limited to the FreeBSD port, due to it causing server's untimely death on Linux). Contributed by Stanley Hopcroft.
  • Improved error checking in send_sms() when parsing the module's reply after +CMGS. Thanks to Stanley Hopcroft for pointing that out.


  • Port to the FreeBSD platform (contributed by Stanley Hopcroft).
  • Improved the sendsms(1) man file to document the various possible exit codes returned by the client.


smslink-0.48b-4 (September 13, 2000)

  • Bugfix release: Fixes a bug when parsing incoming SMS in text mode on the WM02 (and possibly the FA2 as well). The problem was that this model uses <LF> characters to separate the SMS message from its headers instead of the <CR> used by the other models. I included the unixify() function in server/stuff.c to normalize the messages and standardize on the <LF> characters. Both delimiters (and any combination of them) will now be accepted in the input. Thanks to Guido Dolci for helping me track this issue.
  • Improved the debug information output by the server when compiled with -DINCL_DEBUG_CODE. It will now spew an hexdump of the incoming SMS.

smslink-0.48b-3 (September 7, 2000)

  • Bugfix release: Fixes a problem when using a Siemens M20 (added support for a sub-prompt when sending, both in text and PDU mode). Thanks to Silvano Menegoni for the fine tests he made on his equipment.
  • Added support for different date formats in the SMS timestamps when read in text mode. This also meant a change in /etc/gsmcaps format. Adapted gsmcaps(5) accordingly. Thanks to Pierluigi Mangani for pointing that out.
  • Also thanks to Pierluigi Mangani, improved support for incoming SMS by making the parser accept a variable number of fields. Improved error reporting in mbparse().

smslink-0.48b-2 (June 8, 2000)

  • Bugfix release: Fixes a problem preventing the server program to communicate properly with Wavecom WM02 modules. Those modules have a case-sensitive AT command parser and hence accept only capitalized AT commands. Changed send_sms() (in server.y) and mbcheck() (in mbchecker.c) accordingly. Thanks to Andrea Vettori and Frank Friel for letting me know.
  • Adapted gsmdev.h to include a "capability" denoting this behaviour. Adapted gsmcaps to flag the WM02 with it.

smslink-0.48b (May 24, 2000)

  • WARNING: The format of one of the configuration files (/etc/gsmdevices) has changed again due to the improvement described below. Please adapt your config. file accordingly (add the "model" field between the "defmode" and "provider" fields). See gsmdevices(5) or the example config. file header for more details.
  • Included support for sending SMS in PDU mode on all supported modules. SMS reception in PDU mode is not implemented yet.
  • Started to implement some sort of flags-based drivers, that should ease support for different brands of GSM modules (as well as seamlessly allow for the use of multiple modules from different providers on the same server).
  • Added the translatemodname() function to gsmdevices.c to handle the translation from short model name to capacity matrix, as provided by /etc/gsmdevices and /etc/gsmcaps.
  • Already modified the SMS reception procedure (mbckeck()) to use the device-level default mode. Still, only text mode is supported at the present time.
  • Adapted gsmdevcpy() to accomodate for the changes in struct gsms_dev.
  • Solved a bug in the definition of RAND_MAX that would have prevented the election of a new PIN from working, and that used to generate annoying warning messages at compile-time.

smslink-0.46b (April 4, 2000)

  • WARNING: The format of one of the configuration files (/etc/gsmdevices) has changed due to the improvement described below. Please adapt your config. file accordingly (add the "defmode" field between the "defsca" and "provider" fields). See gsmdevices(5) or the example config. file header for more details.
  • Included preliminary support for SMS sending mode support. The default mode (text or PDU) should be defined in the configuration file (/etc/gsmdevices, see above), it can be selected by the user and set in the device, but only text mode is implemented (yet). The "show", "clear" and "devicelist" commands have been adapted accordingly.
  • Fixed a bug that prevented the mailbox check to work with Wavecom WM02 devices. Those are rather touchy on the parameter format used to read messages in relation to the current message format. Thanks to Guido Dolci for pointing that out.
  • Improved the mailbox check procedure by including the "at+csdh" command (full message header detail). Thanks to Piero Baudino for the hint.
  • Made sure we always use text mode to retrieve messages for the mean time. When PDU mode will be fully supported, I'll allow PDU mode for message retrieval as well.
  • The periodic mailbox checks can now be disabled altogether (for users not interested in this functionality, or when it is vital that a "dormant" server wouldn't touch the device except when required). This is done by setting MBCHKINTERVAL to 0 in sms_serv.h before compiling.
  • The server also now rejects abnormal values of MBCHKINTERVAL and exits, logging the error.


  • Improved error handling and reporting in gw_stuff.c. If a mail cannot be delivered, the daemon will now keep it in the inbox and retry next time (while logging the reason for the error).

smslink-0.44b (March 13, 2000)

  • Improved handling of the default SMSC. Now properly picked up from the /etc/gsmdevices file on a per-device basis.
  • Fixed a bug preventing compilation on Slackware 7.0.
  • In the interactive interface, improved the "show" command to also display the length of the message.
  • Added the "aclist" command to the interactive interface.
  • Adapted the sms_serv(1) man page to reflect the changes.
  • Added handling of a checkpoint file to allow for easy synchronization between the server module and the gateway module.
  • Included the version number in the server bootup syslog messages.
  • Splitted the old stuff.c into three files. The new stuff.c now holds functions used by both the server and the gateway module, while serv_stuff.c and gw_stuff.c holds functions specific to each module.


  • Improved the slurp_n_catch() function to be more robust and less vulnerable to changes in server response messages.


  • First public release.


  • Added bulksms (sends the same SMS message to a list of GSM numbers provided in a text file, generates a log with the result for each request).

smslink-0.41b (July 28, 1999)

  • In mbchecker.c, implemented the dialog with the module that will get the incoming messages, the procedure that will save them to disk and the loop to remove them from the SIM card afterwards.
  • Added a command to the regular sending procedure that would avoid notification of incoming messages.
  • Moved three functions from server.y to stuff.c and made them public so that I could re-use them from mbchecker.c.
  • Added a trim() function to stuff.c.
  • Incremented the main version number in sms_serv.[ch].
  • Adapted the sms_serv(1) man page to reflect the changes.

smslink-0.40b (June 25, 1999)

  • Fixed a bug preventing compilation on GLibc2 platform.
  • Added an uptime command to the interactive interface.


  • Fixed a bug preventing compilation on GLibc2 platform.


  • Included a basic web interface to the SMSLink system (Perl CGI script calling the sendsms client - no straight http support in the server).

smslink-0.34b (February 22, 1999)

  • Improved signal handling in general. Moved from the "old" signal() interface to sigaction(). Cleared the bug which prevented users to send a second SMS in the same session.
  • Added a field "owner" in the struct gsms_def, to hold the pid of the child process obtaining a lock on the device. Displayed it through the interactive "dl" command.
  • Cleared a boundary-checking bug in the search for a free GSM instance loop.
  • Already built the programmatic structure to regularly check for incoming messages. The actual dialog with the device is not done yet, though.
  • Implemented a very flexible access control mechanism. Contributed originally by Philipp Klaus.


  • Added the ability to read the message from stdin ("-f -"). Contributed by Philipp Klaus.
  • Ported to Sun Solaris. Contributed by Philipp Klaus.
  • Solved a bug that prevented the previous version of the client to compile under HP-UX.

smslink-0.22b (November 26, 1998)

  • First public release.

Last Modified: September 29th, 2006.
philipa STRUDEL scarlet PUNKT be
SourceForge Logo