summaryrefslogtreecommitdiff
path: root/libmu_sieve
AgeCommit message (Collapse)AuthorFiles
2019-07-23Minor fixSergey Poznyakoff2
Check return from mu_message_get_num_parts
2019-01-03Update copyright yearsSergey Poznyakoff29
2018-10-24sieve: set variables from command lineSergey Poznyakoff4
The new command line option --variable initializes the RFC 5229 variable. * NEWS: Update. * doc/texinfo/programs.texi: Fix description of sieve command line options. * include/mailutils/sieve.h (mu_sieve_variable_initialize): New proto. * libmu_sieve/runtime.c (sieve_run): Call mu_i_sv_init_variables to clear and initialize the table of variables. * libmu_sieve/sieve-gram.y (mu_sieve_machine_dup): Copy variables. (mu_sieve_machine_destroy): Destroy table of variables and initializer list. * libmu_sieve/sieve-priv.h (mu_sieve_machine) <init_var>: New member. (mu_sieve_variable_initializer): New type. (mu_i_sv_init_variables): New proto. * libmu_sieve/variables.c (mu_sieve_variable_initialize): New function. (mu_i_sv_copy_variables): Copy initializers as well. (mu_i_sv_init_variables): New function. * sieve/sieve.c: New command line option --variable. * sieve/tests/variables.at: Test the --variable option.
2018-01-19Version 3.4.90; update copyright yearsSergey Poznyakoff29
2017-11-18Fix the use of uninitialized memorySergey Poznyakoff2
* mh/mh_alias_lex.l (push_source): Initialize locus range prior to copying to it. * libmailutils/cfg/parser.y (mu_cfg_tree_create_node): Likewise. * libmu_sieve/util.c: (mu_sieve_value_create): Likewise.
2017-10-10Use mu_prtstr to safely print string valuesSergey Poznyakoff1
2017-10-10Check for NULL return from mu_address_aget_ and mu_address_sget_ family ↵Sergey Poznyakoff2
functions It is possible that these functions return success and place NULL in the result variable. Make sure this possibility is checked throughout the code. * libmailutils/base/usremail.c (mu_set_user_email): Check for NULL return value from mu_address_[as]get. * libmailutils/mailbox/msgenv.c (message_envelope_sender) * libmailutils/tests/addr.c (parse) * libmu_scm/mu_message.c (mu_scm_message_print): * libproto/mailer/prog.c (_expand_rcpt) * libproto/mailer/smtp.c (_rcpt_to_addr) (mu_address_sget_email) * maidag/lmtp.c (check_address): * mail/from.c (hdr_from): * mail/util.c (util_get_sender): * mh/mh_format.c (addr_cmp, builtin_proper) (builtin_addr, builtin_pers, builtin_note) (builtin_mbox, builtin_path, builtin_formataddr) * mh/mh_whom.c (scan_addrs): * libmu_sieve/util.c (mu_sieve_vlist_compare): Skip NULL returns from retr. * libmu_sieve/actions.c (check_redirect_loop): Error checking. * include/mailutils/types.hin (mu_prstr): New function. * libmu_cpp/address.cc: Use mu_prstr to ensure the printable representation of string. * python/libmu_py/address.c: Likewise. * libmu_scm/mu_address.c (_get_address_part): Likewise. * libmailutils/string/wordsplit.c (expvar): Treat NULL value as "".
2017-09-27Fix build without libtoolSergey Poznyakoff1
* libmu_sieve/load.c [!HAVE_LIBLTDL] (mu_sieve_unload_ext): Dummy function. [!HAVE_LIBLTDL] (mu_sieve_load_ext, mu_i_sv_load_add_dir): Set errno. Fix return value. * mu-aux/gylwrap (yysym): Add more symbols (dumpme): Skip old contents of the BOOTSTRAP section up to the next POD keyword. * mu/libexec/Makefile.am (MUTOOL_LIBRARIES_TAIL): Fix ordering of libraries.
2017-06-20Rework emitting source locations in sieve codeSergey Poznyakoff3
* include/mailutils/locus.h (mu_locus_point_eq): New function. * libmu_sieve/prog.c (mu_i_sv_code): Emit the _mu_i_sv_instr_locus if locus changed. (mu_i_sv_locus): Raise the changeloc flag and set the locus, instead of immediately emitting location change code. * libmu_sieve/runtime.c (_mu_i_sv_instr_locus): New function. (_mu_i_sv_instr_source,_mu_i_sv_instr_line) (_mu_i_sv_instr_col): Remove. * libmu_sieve/sieve-priv.h (mu_sieve_machine) <changeloc>: New member.
2017-06-20Bugfix in sieve librarySergey Poznyakoff1
* libmu_sieve/sieve-gram.y: Add missing assignment to $$ in testlist production. This fixes improper handling of anyof and allof
2017-06-15Make sure all loci are properly initialized before first use.Sergey Poznyakoff2
Clean up semantics of initializers. Each locus type can be initialized either statically (by assigning the MU_LOCUS_*_INITIALIZER macro), or dynamically (by calling mu_locus_*_init function). Whatever method is used, it is important that it be initialized prior to using any other mu_locus_* function. * include/mailutils/locus.h (mu_locus_point_init): Takes single argument. Returns nothing. (mu_locus_range_init): New proto. * libmailutils/locus/locus.c (mu_locus_point_init): Rewrite. (mu_locus_range_init): New function. * libmailutils/cfg/parser.y (mu_cfg_alloc_node): Initialize locus. * libmailutils/tests/logstr.c: Fix printf argyment types. * libmu_sieve/extensions/moderator.c (moderator_filter_message): Initialize locus. * libmu_sieve/sieve-gram.y (node_alloc): Likewise. * mu/libexec/logger.c (parse_locus_point, set_locus): Likewise.
2017-06-14Provide backward compatibility layer for deprecated functions.Sergey Poznyakoff2
* include/mailutils/sieve.h (mu_sieve_compile_text): New proto. (mu_sieve_compile_buffer): Backward-compatible proto. * include/mailutils/stream.h ((MU_IOCTL_LOGSTREAM_GET_LOCUS_DEPRECATED) (MU_IOCTL_LOGSTREAM_SET_LOCUS_DEPRECATED): New defines. (MU_IOCTL_LOGSTREAM_GET_LOCUS) (MU_IOCTL_LOGSTREAM_SET_LOCUS): Use external functions to make sure any references to these are marked as deprecated. * include/mailutils/types.hin (mu_locus_DEPRECATED): New struct. (mu_locus): Define to mu_locus_DEPRECATED * libmailutils/stream/logstream.c (_log_ctl): Handle the deprecated ctls. * libmu_sieve/extensions/moderator.c (moderator_filter_message): Use mu_sieve_compile_text. * libmu_sieve/sieve-gram.y (mu_sieve_compile_buffer): Rename to mu_sieve_compile_text. Re-introduce it as a backward-compatibility API. * sieve/sieve.c: Call mu_sieve_compile_text instead of mu_sieve_compile_buffer.
2017-06-14BugfixesSergey Poznyakoff1
* libmu_sieve/sieve-lex.l: Allocate new ctx structure (restore accidentally deleted file. * libmailutils/locus/debug.c: Add missing copyleft. * libmailutils/locus/genprloc.c: Likewise. * libmailutils/locus/ident.c: Likewise. * libmailutils/locus/linetrack.c: Likewise. * libmailutils/locus/locus.c: Likewise. * mu-aux/gencl: Likewise. * mu-aux/gitinfo: Likewise. * mu-aux/gylwrap: Likewise.
2017-06-13Try to display exact error locations in Sieve diagnosticsSergey Poznyakoff6
* include/mailutils/sieve.h (mu_sieve_value_t)<locus>: New field. * libmu_sieve/util.c (mu_sieve_value_create): Take a pointer to mu_locus_range. Use it to initialize the locus field. * libmu_sieve/sieve-gram.y: Pass loci in calls to mu_sieve_value_create. * libmu_sieve/actions.c: Use the most specific locus when displaying the message. * libmu_sieve/comparator.c: Likewise. * libmu_sieve/prog.c: Likewise. * libmu_sieve/variables.c: Likewise. * sieve/tests/i-numeric.at: Update the expected error location.
2017-06-13Rewrite Makefile rules for lex and bisonSergey Poznyakoff4
The aim is to get rid of the explicit rules and use the Autmake framework as much as possible, without hurting the flexibility. To this effect, the gylwrap tool is rewritten from scratch (in Perl). In compatibility mode it takes the same arguments as the standard ylwrap. Additional configuration is supplied in the configuration file gylwrap.conf, located in the directory where the input file resides. * mu-aux/gylwrap: Rewrite from scratch. * configure.ac (MU_YLWRAP): New subst variable. * libmailutils/base/.gitignore: Update. * libmailutils/base/Makefile.am: Update. * libmailutils/base/gylwrap.conf: New file. * libmailutils/cfg/.gitignore: Update. * libmailutils/cfg/Makefile.am: Use new YLWRAP * libmailutils/cfg/cfg.h: Remove. * libmailutils/cfg/gylwrap.conf: New file. * libmailutils/cfg/lexer.l: Include mailutils/yyloc.h directly. * libmailutils/cfg/parser.y: Likewise. * libmu_sieve/Makefile.am: Use new YLWRAP * libmu_sieve/gylwrap.conf: New file. * libmu_sieve/sieve.y: Rename to libmu_sieve/sieve-gram.y * libmu_sieve/sieve.l: Rename to libmu_sieve/sieve-lex.l * mail/Makefile.am: Use new YLWRAP * mh/.gitignore: Update. * mh/Makefile.am: Use new YLWRAP * mh/gylwrap.conf: New file. * mh/mh_alias.y: Rename to mh/mh_alias_gram.y * mh/mh_alias.l: Rename to mh/mh_alias_lex.l * mh/pick.y: Rename to mh/pick-gram.y * mimeview/.gitignore: Update. * mimeview/Makefile.am: Use new YLWRAP * mimeview/mimetypes.y: Rename to mimeview/grammar.y * mimeview/gylwrap.conf: New file. * mimeview/mimetypes.l: Rename to mimeview/lexer.l * po/POTFILES.in: Update
2017-06-13Switch to new locus typesSergey Poznyakoff12
* include/mailutils/types.hin (mu_locus): Remove. * include/mailutils/diag.h (mu_diag_at_locus): Remove. (mu_diag_at_locus_point,mu_diag_at_locus_range): New protos. * include/mailutils/mailutils.h: Include locus.h * include/mailutils/stream.h (MU_IOCTL_LOGSTREAM_GET_LOCUS) (MU_IOCTL_LOGSTREAM_SET_LOCUS): Remove. * libmailutils/stream/logstream.c (_log_ctl): Reflect this. * libmailutils/tests/logstr.at: Remove the related test. * libmailutils/tests/logstr.c: Ditto. * libmailutils/cfg/Makefile.am: Add new header. * libmailutils/cfg/cfg.h: New file. * libmailutils/cfg/format.c: Use mu_locus_range * libmailutils/cfg/lexer.l: Use the mu_linetrack facility * libmailutils/cfg/parser.y: LIkewise. * libmailutils/diag/diag.c (mu_diag_at_locus): Remove. (mu_diag_at_locus_point,mu_diag_at_locus_range): New protos. * comsat/action.c: Use mu_locus_point and mu_locus_range instead of the removed mu_locus. * include/mailutils/auth.h: Likewise. * include/mailutils/cfg.h: Likewise. * include/mailutils/sieve.h: Likewise. * libmailutils/base/wicket.c: Likewise. * libmailutils/tests/wicket.c: Likewise. * libmu_auth/radius.c: Likewise. * libmu_sieve/actions.c: Likewise. * libmu_sieve/comparator.c: Likewise. * libmu_sieve/extensions/moderator.c: Likewise. * libmu_sieve/mem.c: Likewise. * libmu_sieve/prog.c: Likewise. * libmu_sieve/require.c: Likewise. * libmu_sieve/runtime.c: Likewise. * libmu_sieve/sieve-priv.h: Likewise. * libmu_sieve/sieve.l: Use the mu_linetrack facility. * libmu_sieve/sieve.y: Likewise. * libmu_sieve/util.c: Use mu_locus_point and mu_locus_range instead of the removed mu_locus * libmu_sieve/variables.c: Likewise. * mail/source.c: Likewise. * mu/libexec/dbm.c: Likewise. * mu/libexec/logger.c: Likewise. * mu/libexec/wicket.c: Likewise. * sieve/sieve.c: Likewise. * sieve/tests/i-numeric.at: Update expected locations
2017-06-08Silence remaining *.[yl] rules in MakefilesSergey Poznyakoff1
2017-04-18Fix semantics of mu_header_set_value and creation of multipart/alternative MIMESergey Poznyakoff2
Until now, mu_header_set_value called with replace=0 prepended the header to the header list, if a header with such name was already present. This has been changed. Now, if the header with the requested name is already present, its action is as follows: 1. If repl is 0, return MU_ERR_EXISTS 2. Otherwise, replace the header with the new value. If the header is not present, it is appended to the end of the header list, instead of putting it at the beginning. This change is incompatible and breaks the tests, that relied on a particular field ordering. These are fixed as well. The use of mu_header_set_value throughout the sources has been revised to ensure that single-instance headers are never added twice. This change also facilitates the second part of this commit, which fixes creation of the multipart/alternative message by the mail utility. * libmailutils/mailbox/header.c (mu_header_set_value): Fix semantics. If the replace parameter is not set and the header field with the given name already exists, return MU_ERR_EXISTS without changing anything. If adding new header, append it to the end of the header list, instead of pushing it to the top. * configure.ac: Raise shared library revision number. * libmu_scm/mu_message.c (mu-message-set-header) (mu-message-set-header-fields): call mu_header_set_value explicitly if repl is not set. * libmu_sieve/extensions/moderator.c: Force replace header mode when needed. * libmu_sieve/extensions/vacation.c: Likewise. * mh/mh_init.c (mh_annotate): Prepend the annotation header. * mh/mhn.c: Force replace header mode when needed. * mh/repl.c: Likewise. * mh/send.c: Likewise. * libmailutils/tests/modmesg01.at: Change expected header order. * libmailutils/tests/modmesg03.at: Likewise. * mh/tests/mhn.at: Likewise. * mh/tests/send.at: Likewise. * sieve/tests/moderator.at: Likewise. * sieve/tests/redirect.at: Likewise. * sieve/tests/reject.at: Likewise. * sieve/tests/vacation.at: Likewise. * examples/mta.c (message_finalize): Append X-Authentication-Warning, instead of setting it. Make sure Content-Disposition is not set for parts of a multipart/ alternative MIME message. Some mail readers (notably, yahoo), misinterpret it. * libmailutils/mime/attachment.c (at_hdr): Use mu_header_set_value to set Content-Type and Content-Disposition. * libmailutils/mime/mime.c (_mime_set_content_type): If the content type is set to multipart/alternative, remove the Content-Disposition headers from the message parts. * mail/send.c (saveatt): Don't set content-disposition for multipart/alternative, it is now done by the library. (add_attachments): Warn about ignored headers. Append only Received and X-* headers, replace others. (parse_headers): Append headers. (compose_header_set): Use mu_header_append if COMPOSE_APPEND is requested. * mail/util.c (util_header_expand): Use mu_header_append.
2017-01-30sieve: add a locus indicating end of inputSergey Poznyakoff2
The new node type mu_sieve_node_end is introduced to explicitly mark end of the parse tree. When generating code, this node triggers insertion of _mu_i_sv_instr_source/_mu_i_sv_instr_line before the end of code marker. This, in turn, ensures that a correct location is reported for implicit keep, if logging is enabled. * libmu_sieve/sieve-priv.h (mu_sieve_node_end): New node type. (mu_sieve_node_list): New type (from struct node_list in sieve.y) * libmu_sieve/sieve.y (node_list_add): New function. (input production): Add mu_sieve_node_end at the end of the tree.
2017-01-14BugfixSergey Poznyakoff1
* libmu_sieve/load.c [!HAVE_LIBLTDL] (mu_sieve_load_ext): Fix declaration.
2017-01-01Happy GNU YearSergey Poznyakoff29
2016-12-31Provide a way to discern between erroneous return and user-induced break ↵Sergey Poznyakoff5
condition in foreach iterator functions * libmailutils/diag/errors (MU_ERR_USER0-MU_ERR_USER7): New error constants. Reserved for user's purposes, such as breaking from foreach iterators. * libmaildutils/list/foreach.c (mu_list_foreach): Treat NULL list as a list of 0 elements. * libmailutils/list/foreachdir.c (mu_list_foreach_dir): Likewise. * imap4d/imap4d.h (imap4d_auth_result): Remap constants to MU_ERR_USER[0-2] * libmu_sieve/prog.c (mu_i_sv_lint_command): Use mu_list_locate with the default comparator. * mh/mh_list.c (_comp_name): Rewrite to match the definition of mu_list_comparator_t (mhl_format_run): Set _comp_name as comparator for the env.printed_fields list. (header_is_printed): Use mu_list_locate. * imap4d/authenticate.c: Use MU_ERR_USER0-MU_ERR_USER7 to indicate normal break condition in foreach iterators. * imap4d/imap4d.c: Likewise. * imap4d/namespace.c: Likewise. * libmailutils/auth/auth.c: Likewise. * libmailutils/cfg/driver.c: Likewise. * libmailutils/cfg/parser.y: Likewise. * libmailutils/server/acl.c: Likewise. * libmailutils/server/msrv.c: Likewise. * libmu_sieve/conf.c: Likewise. * libmu_sieve/load.c: Likewise. * libmu_sieve/sieve.l: Likewise. * libmu_sieve/strexp.c: Likewise. * libproto/imap/mbox.c: Likewise. * libproto/imap/search.c: Likewise. * mh/mh_format.c: Likewise. * mh/send.c: Likewise. * mh/sortm.c: Likewise. * mimeview/mimetypes.y: Likewise. * movemail/movemail.c: Likewise.
2016-12-27Revise associative array APISergey Poznyakoff2
* configure.ac (VI_REVISION): Increase. * include/mailutils/assoc.h (mu_assoc_create): Change prototype. (mu_assoc_ref,mu_assoc_ref_install) (mu_assoc_remove_ref): Remove. (mu_assoc_get): New proto. (mu_assoc_lookup,mu_assoc_lookup_ref): New proto. (mu_assoc_install_ref): New proto. (mu_assoc_set_free): Remove. (mu_assoc_set_destroy_item): Set proto. * include/mailutils/types.hin (mu_deallocator_t): New typedef. * include/mailutils/list.h (mu_list_destroy_item_t): Change definition. * libmailutils/base/assoc.c: Rewrite. Link all entries in a doubly-linked list to preserve natural ordering during iterations. * libmailutils/base/mutil.c (mutil_parse_field_map): Update calls to assoc API. * libmailutils/cfg/driver.c (alloc_section_tab) (mu_create_canned_section,mu_create_canned_param) (mu_get_canned_container,parse_mapping) (mu_cfg_field_map): Likewise. * libmailutils/mime/mimehdr.c (_mu_mime_param_free): Free the pointer itself. (flush_param,mu_mime_param_assoc_create) (mu_mime_param_assoc_add) (_mime_header_parse) (mu_mimehdr_aget_decoded_param): Update calls to assoc API. (mu_mime_param_free): New function. * libmailutils/property/assocprop.c: Likewise. * libmu_sieve/environment.c: Likewise. * libmu_sieve/variables.c: Likewise. * libproto/imap/id.c: Likewise. * mail/alias.c: Likewise. * mail/testsuite/mail/alias.exp: Update ordering of expected output. * mu/imap.c (com_id): Update. * include/mailutils/mime.h (mu_rfc2047_decode_param): Change prototype. * libmailutils/base/rfc2047.c (mu_rfc2047_decode_param): Allocate returned value, instead of filling an already allocated structure. * libproto/imap/fetch.c: Reflect changes.
2016-12-26Fix typecasts in sieveSergey Poznyakoff1
* libmu_sieve/sieve.y (sieve_parse): Make sure 0 is properly promoted to sieve_instr_t.
2016-12-21imap: fix LIST "" "mbox"Sergey Poznyakoff1
* imap4d/list.c (imap4d_list): Move the longest directory prefix to the reference. * imap4d/tests/list.at: New testcase. * libmu_sieve/tests.c: Fix bug introduced by previous commit
2016-12-20sieve: improve address testsSergey Poznyakoff1
* libmu_sieve/tests.c (retrieve_address): Treat MU_ERR_EMPTY_ADDRESS as MU_ERR_NOENT. This complements 678d93678
2016-12-20BugfixesSergey Poznyakoff1
* libmu_sieve/sieve.y (mu_sieve_machine_clone): Fix memory allocation. * mh/pick.c: Remove unused functions.
2016-12-13Minor changes in sieve.Sergey Poznyakoff2
* libmu_sieve/runtime.c (mu_sieve_abort): Jump with code MU_ERR_FAILURE. * libmu_sieve/tests.c (retrieve_address): Tolerate empty addresses. (retrieve_header): Return reasonable error code. * maidag/script.c (script_apply): If the script failed, return 0.
2016-12-13Version 3.1Sergey Poznyakoff7
* configure.ac: version 3.1 * NEWS: Likewise. * libmu_sieve/comparator.c: Attend to FIXMEs. * libmu_sieve/conf.c: Likewise. * libmu_sieve/prog.c: Likewise. * libmu_sieve/runtime.c: Likewise. * libmu_sieve/sieve.y: Likewise. * libmu_sieve/util.c: Likewise. * libmu_sieve/variables.c: Likewise. * po/POTFILES.in: Add new files.
2016-12-13libmu_sieve: minor fixSergey Poznyakoff1
* libmu_sieve/util.c (mu_sieve_value_get): Treat actual string and expected string list as equivalent types.
2016-12-13BugfixesSergey Poznyakoff1
* libmu_sieve/sieve.y: Fix compilation of chained elsif conditions. * sieve/sieve.c: Define the location environment item.
2016-12-13Document changes to SieveSergey Poznyakoff1
* NEWS: Update. * doc/texinfo/libmu_sieve.texi: Update. * doc/texinfo/sieve.texi: Document extensions * libmu_sieve/comparator.c (mu_sieve_match_part_checker): Check the type of the 2nd argument. * sieve/sieve.c: Define "location" and "phase" environment items. * sieve/tests/pipetest.at: Use "pipe" as the capability string.
2016-12-13New sieve machine accessor functionsSergey Poznyakoff1
* include/mailutils/sieve.h (mu_sieve_get_mailbox) (mu_sieve_get_argc): New protos. * libmu_sieve/runtime.c: New functions.
2016-12-12Minor fixSergey Poznyakoff1
2016-12-11Support for environment extension (RFC 5183).Sergey Poznyakoff6
* include/mailutils/sieve.h (mu_sieve_require_environment): New proto. * libmu_sieve/Makefile.am: Add environment.c * libmu_sieve/environment.c: New file. * libmu_sieve/require.c: Handle "environment" keyword. * libmu_sieve/sieve-priv.h (mu_sieve_machine) <exenv>: New member. * libmu_sieve/sieve.l: Bugfixes * libmu_sieve/variables.c: Add missing static qualifiers * sieve/sieve.c: New option --environment
2016-12-08sieve: fix the mu_sieve_vlist_compare APISergey Poznyakoff4
* libmu_sieve/util.c (mu_sieve_vlist_compare): Rewrite. * include/mailutils/sieve.h (mu_sieve_retrieve_t): Change signature. All uses changed. (mu_sieve_relational_count): Remove. (mu_sieve_vlist_compare): Change signature. * libmu_sieve/extensions/list.c (list_retrieve_header): Always return meaningful status. * libmu_sieve/tests.c (mu_sieve_relational_count): Remove. (retrieve_address,retrieve_envelope): Return meaningful status. (retrieve_header): Iterate over all mime parts, if required. (sieve_test_address,sieve_test_header): Rewrite. * libmu_sieve/variables.c (sieve_test_string): Rewrite using mu_sieve_vlist_compare.
2016-12-07Implement the "variables" Sieve extension (RFC 5229)Sergey Poznyakoff11
* include/mailutils/sieve.h (mu_sieve_string): New fields "constant" and "changed". (mu_sieve_match_part_tags): New extern. (mu_sieve_relational_count) (mu_sieve_require_variables) (mu_sieve_has_variables) (mu_sieve_string_get): New functions. * libmu_sieve/variables.c: New file. * libmu_sieve/Makefile.am: Add variables.c * libmu_sieve/comparator.c: Use mu_sieve_string_get to obtain the actual value of the string. * libmu_sieve/require.c: Support the "variables" extension. * libmu_sieve/sieve-priv.h (mu_sieve_machine): New fields vartab, match_string, match_buf, match_count, match_max. (mu_i_sv_copy_variables) (mu_i_sv_expand_variables): New protos. * libmu_sieve/sieve.l (line_add): zero length means add entire asciiz string. * libmu_sieve/sieve.y (mu_sieve_machine_reset): Reset the new fields. (mu_sieve_machine_clone): Copy variables and initialize new fields. (string_rescan): New function. (sieve_parse): Rescan string to determine their properties. * libmu_sieve/strexp.c (update_len): Allow for NULL replacement values. * libmu_sieve/string.c (mu_sieve_string_get): New function. (mu_sieve_string): Use it. * libmu_sieve/tests.c (do_count): Rename to mu_sieve_relational_count, make global. All uses changed. (match_part_tags): Rename to mu_sieve_match_part_tags, make global. All uses changed. * sieve/tests/variables.at: New file. * sieve/tests/Makefile.am: Add new testcases. * sieve/tests/testsuite.at: Likewise.
2016-12-06Use glob API in sieveSergey Poznyakoff1
* libmu_sieve/comparator.c: Use mu_glob_compile instead of fnmatch.
2016-12-04sieve: redo symbol registry support.Sergey Poznyakoff20
The purpose is to simplify the machine structure and to ensure its clones are completely independent of the master instance. * include/mailutils/sieve.h (mu_sieve_command): New struct. (mu_sieve_record): New enum (mu_sieve_registry_t): Generalize for storing various types of objects. (mu_sieve_test_lookup,mu_sieve_action_lookup) (mu_sieve_require_action,mu_sieve_require_test) (mu_sieve_require_comparator): Remove. (mu_sieve_register_test_ext,mu_sieve_register_test) (mu_sieve_register_action_ext,mu_sieve_register_action) (mu_sieve_register_comparator) (mu_sieve_load_ext): Change return type. (mu_sieve_registry_require,mu_sieve_unload_ext): New functions. (mu_sieve_machine_inherit): Rename to mu_sieve_machine_clone. * libmu_sieve/sieve-priv.h (mu_sieve_machine): Remove source_list, test_list, action_list, and comp_list. Add a single registry list instead. Add space for file and command (action and test) names: idspace, idcount, idmax. Remove unused field "stack"; (mu_i_sv_lex_finish): Change prototype. (_mu_i_sv_instr_push,_mu_i_sv_instr_pop): Remove protos. (mu_i_sv_id_canon,mu_i_sv_id_num) (mu_i_sv_id_str,mu_i_sv_free_idspace): New protos. * libmu_sieve/register.c: Rename to registry.c * libmu_sieve/registry.c (mu_sieve_test_lookup) (mu_sieve_action_lookup): Remove. (mu_sieve_require_test,mu_sieve_require_action): Remove. (mu_sieve_registry_require): New function. (mu_sieve_registry_add,mu_sieve_registry_lookup): New functions. * libmu_sieve/Makefile.am: Update. * libmu_sieve/comparator.c: Rewrite using new registry functions. * libmu_sieve/load.c (mu_sieve_load_ext): Return module handle. (mu_sieve_unload_ext): New function. * libmu_sieve/mem.c (mu_sieve_free): Gracefully handle NULL argument. (mu_i_sv_id_canon,mu_i_sv_id_num,mu_i_sv_id_str): New functions. * libmu_sieve/prog.c (mu_i_sv_locus): Store index of the file name in the id space, instead of pointer to the name itself. * libmu_sieve/require.c (mu_sieve_require): Rewrite. * libmu_sieve/runtime.c (_mu_i_sv_instr_source): Expect ID index as argument. (_mu_i_sv_instr_push) (_mu_i_sv_instr_pop): Remove unused instructions. * libmu_sieve/sieve.l (file_names): Remove. Use mu_sieve_machine idspace instead. * libmu_sieve/sieve.y (mu_sieve_machine_clone) (mu_sieve_machine_dup): Rewrite. (mu_sieve_machine_destroy): Free idspace and registry * examples/numaddr.c: Reflect changes. * libmu_sieve/extensions/editheader.c: Likewise. * libmu_sieve/extensions/list.c: Likewise. * libmu_sieve/extensions/moderator.c: Likewise. * libmu_sieve/extensions/pipe.c: Likewise. * libmu_sieve/extensions/spamd.c: Likewise. * libmu_sieve/extensions/timestamp.c: Likewise. * libmu_sieve/extensions/vacation.c: Likewise.
2016-12-03Rename mu_sieve_machine_init to mu_sieve_machine_createSergey Poznyakoff1
2016-12-03CleanupSergey Poznyakoff5
* include/mailutils/sieve.h (SVT_IDENT): Remove. * libmu_sieve/comparator.c (mu_sieve_match_part_checker): Remove unused variable. * libmu_sieve/mem.c (mu_sieve_reclaim_list): Remove function. * libmu_sieve/sieve.y: Remove leftover uses of SVT_IDENT. * libmu_sieve/util.c: Likewise. * libmu_sieve/sieve-priv.h: Remove useless prototypes.
2016-12-02sieve: change string allocation and argument passing conventionSergey Poznyakoff16
Strings are allocated in a per-machine string space. String and argument lists form contiguous arrays of structures. Regular ex- pressions are compiled when they are needed. Compiled expressions are cached for eventual reuse.
2016-11-29sieve: improve memory allocationSergey Poznyakoff8
* include/mailutils/sieve.h (mu_sieve_alloc) (mu_sieve_palloc,mu_sieve_prealloc) (mu_sieve_pfree,mu_sieve_pstrdup): Remove. (mu_sieve_mstrdup,mu_sieve_mrealloc) (mu_sieve_mfree): Remove. (mu_sieve_reclaim_t): New typedef. (mu_sieve_calloc,mu_sieve_strdup) (mu_sieve_realloc) (mu_sieve_reclaim_default,mu_sieve_reclaim_list) (mu_sieve_reclaim_value,mu_sieve_reclaim_tag): New functions (mu_sieve_value_create): Change prototype (take mu_sieve_machine_t as first argument) * libmu_sieve/mem.c: New file. * libmu_sieve/Makefile.am: Add new file. * libmu_sieve/comparator.c: Use new allocation functions. * libmu_sieve/prog.c: Likewise. * libmu_sieve/register.c: Likewise. * libmu_sieve/sieve.l: Likewise. * libmu_sieve/sieve.y: Likewise. * libmu_sieve/util.c: Likewise. * doc/texinfo/libmu_sieve.texi: Update (needs revision).
2016-11-28sieve: more improvements to the argument/tag runtime access APISergey Poznyakoff14
* include/mailutils/sieve.h (mu_sieve_handler_t): Change signature: remove args and tags arguments, they are contained in struct mu_sieve_machine now. (mu_sieve_get_comparator) (mu_sieve_relcmpn_t): Change signature. (mu_sieve_tag_lookup,mu_sieve_tag_lookup_untyped): Remove (mu_sieve_get_tag,mu_sieve_get_tag_untyped): New protos. (mu_sieve_value_get_optional): Replace by mu_sieve_get_arg_optional. (mu_sieve_value_get_untyped): Replace by mu_sieve_get_arg_untyped. (mu_sieve_value_get): Replace by mu_sieve_get_arg. All uses changed. * libmu_sieve/sieve-priv.h (mu_sieve_machine): New members: arg_list and tag_list * libmu_sieve/runtime.c (instr_run): Set up identifier, arg_list, and tag_list in mu_sieve_machine_t before calling the handler. Reset them afterward. * libmu_sieve/util.c (mu_sieve_value_get_optional): Replace by mu_sieve_get_arg_optional. (mu_sieve_value_get_untyped): Replace by mu_sieve_get_arg_untyped. (mu_sieve_value_get): Replace by mu_sieve_get_arg. (mu_sieve_tag_lookup): Replace by mu_sieve_get_tag (mu_sieve_tag_lookup_untyped): Replace by mu_sieve_get_tag_untyped
2016-11-26sieve: improve argument/tag runtime access APISergey Poznyakoff13
* include/mailutils/sieve.h (mu_sieve_data_type): Remove SVT_VALUE_LIST. (mu_sieve_value_storage): Named union for use in mu_sieve_value_t; remove the tag field. (mu_sieve_tag_lookup): Change prototype. (mu_sieve_value_get): Change prototype. (mu_sieve_value_get_optional) (mu_sieve_value_get_untyped): New functions. (mu_sieve_arg_error): Removed proto. * libmu_sieve/sieve.y: Remove SVT_VALUE_LIST support. * libmu_sieve/util.c (mu_sieve_value_create) (mu_sieve_type_str,mu_sieve_vlist_do): Remove SVT_VALUE_LIST support. (mu_sieve_value_get): Rewrite. (mu_sieve_value_get_untyped) (mu_sieve_value_get_optional): New functions. (mu_sieve_arg_error): Remove. (mu_sieve_tag_lookup): Rewrite. (mu_sieve_tag_lookup_untyped): New function. * doc/texinfo/libmu_sieve.texi: Update. libmu_sieve/tests.c libmu_sieve/actions.c libmu_sieve/extensions/editheader.c libmu_sieve/extensions/list.c libmu_sieve/extensions/moderator.c libmu_sieve/extensions/pipe.c libmu_sieve/extensions/spamd.c libmu_sieve/extensions/timestamp.c libmu_sieve/extensions/vacation.c libmu_sieve/relational.c examples/numaddr.c
2016-11-26Minor fixesSergey Poznyakoff2
* libmu_sieve/sieve-priv.h (sieve_op_t) <unum>: New field. * libmu_sieve/sieve.l: Leave one string interpreter slot.
2016-11-25Implement RFC 5228, 2.4.2.4 (Encoding Characters Using "encoded-character")Sergey Poznyakoff6
* libmu_sieve/encoded.c: New file. * libmu_sieve/strexp.c: New file. * libmu_sieve/Makefile.am: Add new files. * libmu_sieve/require.c (mu_sieve_require): Understand "encoded-character". * libmu_sieve/sieve-priv.h (mu_i_sv_interp_t): New typedef. (mu_i_sv_expand_encoded_char): New proto. (mu_sieve_require_encoded_character): New proto. * libmu_sieve/sieve.l (string): Rewrite via line_.* functions. This fixes memory leaks on mu_sieve_machine_destroy. (line_finish): Expand ${} sequences before returning. (mu_sieve_require_encoded_character): New function. * sieve/tests/enc-char.at: New file. * sieve/tests/Makefile.am: Add enc-char.at * sieve/tests/testsuite.at: Likewise.
2016-11-24sieve: simplify action logging APISergey Poznyakoff1
* include/mailutils/sieve.h (mu_sieve_action_log_t): Change proto. * lib/sieve.c (_sieve_action_log): Rewrite. * libmu_sieve/util.c (mu_sieve_log_action): Rewrite. * python/libmu_py/sieve.c (_sieve_action_printer): Rewrite. * sieve/sieve.c (_sieve_action_log): Rewrite.
2016-11-24sieve: provide a separate stream for debugging outputSergey Poznyakoff4
* include/mailutils/sieve.h (MU_SIEVE_DEBUG_TRACE) (MU_SIEVE_DEBUG_INSTR,MU_SIEVE_DEBUG_DISAS) (MU_SIEVE_DRY_RUN): Remove. (mu_sieve_machine_init_ex): Remove proto. (mu_sieve_set_dbg_stream,mu_sieve_get_dbg_stream) (mu_sieve_stream_save) (mu_sieve_stream_restore): New protos. * libmu_sieve/runtime.c (INSTR_DISASS,INSTR_DEBUG): Reimplement. * libmu_sieve/sieve-priv.h (MU_SV_SAVED_ERR_STATE) (MU_SV_SAVED_DBG_STATE,MU_SV_SAVED_STATE): New bitflags. (mu_sieve_state_disass): New constant. (mu_sieve_machine)<state_flags, err_mode> <err_locus,dbg_mode,dbg_locus>: New members. <dbgstream>: New member. * libmu_sieve/sieve.y (mu_sieve_machine_init_ex): Remove. (mu_sieve_machine_dup, mu_sieve_machine_inherit): Fix. (mu_sieve_set_dbg_stream) (mu_sieve_get_dbg_stream): New functions. (mu_sieve_machine_destroy): Destroy dbgstream. (with_machine): Preserve stream state (mode & locus). * libmu_sieve/util.c (mu_i_sv_debug,mu_i_sv_debug_command): Use ioctl instead of format strings. (mu_sieve_stream_save, mu_sieve_stream_restore): New functions. * python/libmu_py/sieve.c (api_sieve_machine_init): Use mu_sieve_machine_init. * sieve/sieve.c: Improve help output. (main): Dump disassembled code to standard output.
2016-11-24Sieve: remove unused opcodeSergey Poznyakoff2
* libmu_sieve/runtime.c (_mu_i_sv_instr_nop): Remove. * libmu_sieve/sieve-priv.h: Likewise.

Return to:

Send suggestions and report system problems to the System administrator.