1. 05 Feb, 2008 2 commits
  2. 04 Feb, 2008 2 commits
    • New member `child_pid'.
      (children): Remove global.
      (m_server_list): New variable. Keeps track of created m_servers.
      (alloc_children, register_child, unregister_child)
      (terminate_children): New functions.
      (m_server_cleanup): New function.
      (mu_m_server_idle): Iterate over all registered m-servers until
      one of them recognizes the child.
      (mu_m_server_create,mu_m_server_destroy): Keep track of existing
      m-servers using m_server_list.
      (mu_m_server_set_max_children): Rewrite using alloc_children.
      (mu_m_server_run): Terminate all children before returning.
      (m_srv_conn): Use register_child to remember created children.
      Sergey Poznyakoff authored
    • * examples/header.c: New command `itr'.
      (main): Empty input repeats the recent command.
      * include/mailutils/header.h (mu_header_get_iterator): New
      function.
      * libproto/include/header0.h (struct _mu_header): New member itr.
      * mailbox/Makefile.am (libmailutils_la_SOURCES): Add hdritr.c
      * mailbox/hdritr.c: New file.
      * mailbox/header.c (mu_header_remove): Bugfix. Invalidate the
      header after removal.
      Sergey Poznyakoff authored
  3. 31 Jan, 2008 1 commit
  4. 28 Jan, 2008 1 commit
  5. 24 Jan, 2008 3 commits
  6. 22 Jan, 2008 4 commits
  7. 16 Jan, 2008 2 commits
  8. 14 Jan, 2008 2 commits
    • * include/mailutils/syslog.h (mu_log_facility, mu_log_tag): New
      declarations.
      (MU_LOG_TAG): New define.
      * mailbox/gocs.c (mu_gocs_logging_init): Set mu_log_tag.
      * mailbox/syslog.c (mu_log_facility, mu_log_tag): New variables.
      * libcfg/common.c (mu_logging_param): New statement `tag'.
      * comsat/comsat.c, imap4d/imap4d.c, imap4d/login.c,
      maidag/maidag.c, mail.local/main.c, pop3d/pop3d.c, pop3d/user.c,
      sieve/sieve.c: Use MU_LOG_TAG in openlog, and
      program_version in mu_m_server_create calls.
      Sergey Poznyakoff authored
    • _path_append.
      * libsieve/load.c (sieve_init_load_path): New function.
      (load_module,sieve_load_add_path,sieve_load_add_dir): Call
      sieve_init_load_path.
      * mail.local/main.c (parse_opt): Bugfix. Translate -S option to
      sieve-filter configuration statement.
      Sergey Poznyakoff authored
  9. 13 Jan, 2008 3 commits
    • * configure.ac: Define DEFAULT_TEXT_DOMAIN
      * comsat/comsat.c, dotlock/dotlock.c, frm/frm.c, frm/from.c,
      guimb/main.c, imap4d/imap4d.c, maidag/maidag.c, mail/mail.c,
      mail.local/main.c, mail.remote/mail.remote.c, messages/messages.c,
      mh/ali.c, mh/anno.c, mh/burst.c, mh/comp.c, mh/fmtcheck.c,
      mh/folder.c, mh/forw.c, mh/inc.c, mh/install-mh.c, mh/mark.c,
      mh/mhl.c, mh/mhn.c, mh/mhparam.c, mh/mhpath.c, mh/pick.c,
      mh/refile.c, mh/repl.c, mh/rmf.c, mh/rmm.c, mh/scan.c, mh/send.c,
      mh/sortm.c, mh/whatnow.c, mh/whom.c, mimeview/mimeview.c,
      movemail/movemail.c, pop3d/pop3d.c, pop3d/popauth.c,
      readmsg/readmsg.c, sieve/sieve.c,
      Use MU_APP_INIT_NLS instead of mu_init_nls.
      * mailbox/nls.c (mu_init_nls): Do not call textdomain.
      Sergey Poznyakoff authored
    • Sergey Poznyakoff authored
    • Sergey Poznyakoff authored
  10. 12 Jan, 2008 1 commit
  11. 11 Jan, 2008 2 commits
  12. 09 Jan, 2008 2 commits
    • compatibility with other modules.
      * auth/radius.c, auth/sql.c: Use mu_vartab_t for expansion.
      * include/mailutils/mailutils.h: Include mailutils/assoc.h
      * lib/tcpwrap.c (mu_tcpwrapper_access): Ignore local sockets.
      * libargp/muinit.c (mu_app_init): Re-assign mu_program_name after
      command line parsing, so that --program-name takes effect.
      * libcfg/sql.c (mu_sql_param): Fix typo in statement name.
      * libproto/include/amd.h (struct _amd_message.create): New member.
      * libproto/maildir/mbox.c (maildir_create): New function.
      (_mailbox_maildir_init): Set amd->create.
      * mailbox/amd.c (amd_open): Call amd->create after successfully
      creating the directory.
      * mailbox/cfg_driver.c (_cb_include): Mask out
      MU_PARSE_CONFIG_GLOBAL in the flags.
      (mu_build_container): Bugfix. Take struct include_data as
      argument, instead of using an auto variable. All callers updated.
      * mailbox/ipsrv.c (mu_ip_tcp_accept): Bugfix: use client address,
      not server, to print diagnostics.
      * mailbox/msrv.c (m_srv_conn): Fix prefork condition for
      single-process mode.
      Sergey Poznyakoff authored
    • * include/mailutils/server.h (mu_m_server_set_foreground)
      (mu_m_server_foreground,mu_m_server_pidfile)
      (mu_m_server_set_default_address)
      (mu_m_server_get_srvlist)
      (mu_m_server_get_default_address): New functions.
      * libargp/muinit.c (get_canonical_name): Do not use xmalloc.
      * mailbox/ipsrv.c (mu_ip_server_get_sockaddr): Return
      MU_ERR_BUFSPACE if provided buffer is not long enough to
      accomodate the result.
      * mailbox/msrv.c (mu_m_server_set_foreground)
      (mu_m_server_foreground,mu_m_server_pidfile)
      (mu_m_server_set_default_address)
      (mu_m_server_get_srvlist)
      (mu_m_server_get_default_address)
      (mu_m_server_parse_url): New functions.
      Sergey Poznyakoff authored
  13. 06 Jan, 2008 1 commit
    • * libproto/include/amd.h (struct _amd_message): Remove `deleted',
      add `orig_flags' instead.
      (struct _amd_data): Remove `msg_file_name', add `cur_msg_file_name'
      and `new_msg_file_name'.
      Add `mailbox_size'.
      * libproto/maildir/mbox.c (struct _maildir_message): Remove
      `newflag', add `dir'.
      (maildir_name_info_ptr): New function.
      (mk_info_filename): Bugfix.
      (maildir_cur_message_name, maildir_new_message_name): New
      functions.
      (maildir_msg_init): Set ->dir
      (maildir_msg_finish_delivery): Handle error conditions.
      (maildir_scan_dir): New argument `dirname'. Initialize orig_flags.
      (maildir_qfetch): Initialize dir.
      (_mailbox_maildir_init): Set cur_msg_file_name and
      new_msg_file_name.
      * libproto/mh/mbox.c (_mh_cur_message_name)
      (_mh_new_message_name): New functions.
      (mh_scan0): Initialize orig_flags.
      (_mailbox_mh_init): Set cur_msg_file_name and
      new_msg_file_name.
      * mailbox/amd.c (amd_message_qid, _amd_message_save)
      (amd_append_message, amd_expunge, amd_scan_message)
      (amd_pool_open, amd_header_fill): Use appropriate msg_file_name
      functions.
      (amd_get_size): Implemented.
      * mailbox/mailbox.c (mu_mailbox_flush): Bugfix.
      Sergey Poznyakoff authored
  14. 05 Jan, 2008 3 commits
    • * mailbox/Makefile.am: Replace tcpsrv.c with ipsrv.c.
      * mailbox/tcpsrv.c: Replace with ...
      * mailbox/ipsrv.c: ... this file, which supports both TCP and UDP.
      
      * mailbox/msrv.c: Use mu_ip_server_t.
      * mailbox/server.c (mu_server_destroy): Bugfix.
      * comsat/comsat.c, comsat/comsat.h: Use m-server.
      
      * maidag/lmtp.c, maidag/maidag.h, pop3d/pop3d.c: Update to match
      changed m-server types.
      
      * include/mailutils/server.h (mu_tcp_*): Replace with mu_ip_*.
      Add new prototypes.
      * include/mailutils/types.hin: Likewise.
      
      * lib/tcpwrap.c, lib/tcpwrap.h (mu_tcp_wrapper_prefork): Update
      signature to match mu_m_server_prefork_fp.
      
      * examples/echosrv.c: Use mu_ip_server_t
      * imap4d/idle.c, imap4d/imap4d.c, imap4d/imap4d.h,
      imap4d/preauth.c, imap4d/util.c: Remove mu_gocs_daemon.
      * include/mailutils/gocs.h, include/mailutils/libargp.h,
      include/mailutils/libargp.h, libargp/cmdline.c,
      libargp/common.c, libcfg/common.c, libcfg/init.c,
      mailbox/daemon.c, mailbox/gocs.c: Remove mu_gocs_daemon.
      
      * mailbox/amd.c (amd_open): Provide a null-locker.
      * include/mailutils/locker.h, mailbox/locker.c
      (mu_locker_mod_flags): New function.
      
      * examples/config/mailutils.schema: LDAP schema for Mailutils.
      * examples/config/Makefile.am: Add mailutils.schema
      
      * dotlock/dotlock.c (main): Remove superfluous invocation of
      mu_locker_set_flags.
      
      * libproto/mbox/mbox.c (mbox_quick_get_message): Return
      MU_ERR_NOENT if mailbox is empty.
      
      * mailbox/tcpsrv.c (family_to_proto): Rename to
      mu_address_family_to_domain.
      * po/POTFILES.in: Update.
      * pop3d/lock.c (pop3d_lock): use mu_locker_mod_flags, instead of
      mu_locker_set_flags.
      Sergey Poznyakoff authored
    • Sergey Poznyakoff authored
    • function type.
      (mu_m_server_destroy, mu_m_server_set_prefork)
      (mu_m_server_configured_count, mu_m_server_end): New functions.
      * mailbox/msrv.c (struct _mu_m_server.prefork): New member.
      (mu_m_server_set_prefork): New function.
      (m_srv_conn): Use prefork to decide whether to proceed with a
      connection.
      
      * lib/tcpwrap.c, lib/tcpwrap.h (mu_tcp_wrapper_prefork): New
      function.
      
      * imap4d/imap4d.c, maidag/lmtp.c, maidag/maidag.c,
      pop3d/pop3d.c: Use m-server prefork to handle TCP wrappers.
      
      * po/POTFILES.in: Add more files.
      Sergey Poznyakoff authored
  15. 04 Jan, 2008 3 commits
    • Add debug.h · 846221a1
      Sergey Poznyakoff authored
    • * mailbox/msrv.c: New file.
      * mailbox/Makefile.am: Add msrv.c.
      * include/mailutils/server.h (mu_tcp_server_conn_fp): Take
      sockaddr as argument
      (mu_tcp_server_create,mu_tcp_server_get_sockaddr): Likewise.
      (mu_m_server_*): New prototypes.
      * include/mailutils/types.hin (mu_m_server_t): New type.
      * mailbox/acl.c: Fix debugging output.
      (mu_sockaddr_to_str, mu_sockaddr_to_astr): New functions.
      
      * mailbox/tcpsrv.c: Handle AF_INET and AF_UNIX sockets.
      * examples/echosrv.c: Update mu_tcp_server_* calls.
      * examples/config/Makefile.am: Remove comsat.conf and
      mailutils.rc.
      
      * imap4d/imap4d.c, imap4d/imap4d.h, imap4d/signal.c,
      maidag/lmtp.c, maidag/maidag.c, maidag/maidag.h, pop3d/extra.c,
      pop3d/pop3d.c, pop3d/pop3d.h, pop3d/signal.c: Rewrite using
      m-server.
      
      * include/mailutils/cfg.h (mu_offsetof): Bug fix.
      * mailbox/cfg_driver.c (dup_container): Bugfix. Offset was not
      copied.
      (mu_cfg_section_add_params): If identifier starts with a dot, it
      is hidden, i.e. its substatements are copied directly into the
      parent structure.
      * mailbox/cfg_lexer.c (isword): Take care of opening braces.
      (default_lexer): Several fixes.
      * mailbox/cfg_parser.y (mu_cfg_parse): Initialize debugging level
      from global settings.
      (_scan_tree_helper): Ensure debugging object has correct locus
      information before calling the section parser.
      (mu_cfg_scan_tree): If no debugging object is supplied, use the
      one from diag.c
      * mailbox/daemon.c (mu_daemon_create_pidfile): Return a meaningful
      error code.
      * mailbox/debug.c (mu_debug_create): Initialize printer to NULL.
      (mu_debug_vprintf): If printer is NULL, use
      mu_debug_default_printer.
      (mu_debug_check_level): Bugfix.
      
      * mailbox/server.c: Minor indentation fix.
      * mailbox/syslog.c (mu_diag_syslog_printer): Chop off \r as well.
      * mailbox/folder.c (mu_folder_create_from_record): Bugfixes.
      
      * include/mailutils/debug.hm4 (mu_sockaddr_to_str)
      (mu_sockaddr_to_astr): New functions.
      
      * include/mailutils/.cvsignore: Add debug.h
      
      * po/POTFILES.in: Update.
      Sergey Poznyakoff authored
    • * mailbox/msrv.c: New file.
      * mailbox/Makefile.am: Add msrv.c.
      * include/mailutils/server.h (mu_tcp_server_conn_fp): Take
      sockaddr as argument
      (mu_tcp_server_create,mu_tcp_server_get_sockaddr): Likewise.
      (mu_m_server_*): New prototypes.
      * include/mailutils/types.hin (mu_m_server_t): New type.
      * mailbox/acl.c: Fix debugging output.
      (mu_sockaddr_to_str, mu_sockaddr_to_astr): New functions.
      
      * mailbox/tcpsrv.c: Handle AF_INET and AF_UNIX sockets.
      * examples/echosrv.c: Update mu_tcp_server_* calls.
      * examples/config/Makefile.am: Remove comsat.conf and
      mailutils.rc.
      
      * imap4d/imap4d.c, imap4d/imap4d.h, imap4d/signal.c,
      maidag/lmtp.c, maidag/maidag.c, maidag/maidag.h, pop3d/extra.c,
      pop3d/pop3d.c, pop3d/pop3d.h, pop3d/signal.c: Rewrite using
      m-server.
      
      * include/mailutils/cfg.h (mu_offsetof): Bug fix.
      * mailbox/cfg_driver.c (dup_container): Bugfix. Offset was not
      copied.
      (mu_cfg_section_add_params): If identifier starts with a dot, it
      is hidden, i.e. its substatements are copied directly into the
      parent structure.
      * mailbox/cfg_lexer.c (isword): Take care of opening braces.
      (default_lexer): Several fixes.
      * mailbox/cfg_parser.y (mu_cfg_parse): Initialize debugging level
      from global settings.
      (_scan_tree_helper): Ensure debugging object has correct locus
      information before calling the section parser.
      (mu_cfg_scan_tree): If no debugging object is supplied, use the
      one from diag.c
      * mailbox/daemon.c (mu_daemon_create_pidfile): Return a meaningful
      error code.
      * mailbox/debug.c (mu_debug_create): Initialize printer to NULL.
      (mu_debug_vprintf): If printer is NULL, use
      mu_debug_default_printer.
      (mu_debug_check_level): Bugfix.
      
      * mailbox/server.c: Minor indentation fix.
      * mailbox/syslog.c (mu_diag_syslog_printer): Chop off \r as well.
      * mailbox/folder.c (mu_folder_create_from_record): Bugfixes.
      
      * include/mailutils/debug.hm4 (mu_sockaddr_to_str)
      (mu_sockaddr_to_astr): New functions.
      
      * include/mailutils/.cvsignore: Add debug.h
      
      * po/POTFILES.in: Update.
      Sergey Poznyakoff authored
  16. 02 Jan, 2008 1 commit
    • * libproto/include/property0.h (struct property_item): Remove
      key, set and next.
      (struct _mu_property): Use mu_assoc_t to keep the items.
      * mailbox/property.c: Rewrite using mu_assoc_t for storage.
      
      * mailbox/parsedate.y (DATE_SET): Take an additional argument
      specifying upper limit for the value. Bail out if val is out of
      range. All callers updated.
      (SET_.*): Rewrite via __SET_.*
      Sergey Poznyakoff authored
  17. 30 Dec, 2007 4 commits
    • (main): Use /dev/null as the tty if require-tty is false.
      Sergey Poznyakoff authored
    • * comsat/cfg.c: Remove.
      * comsat/comsat.c: Use MU configuration and acls.
      * comsat/comsat.h: Include acl.h
      * libproto/maildir/mbox.c (maildir_qfetch): Bugfix.
      Sergey Poznyakoff authored
    • * comsat/cfg.c: Remove.
      * comsat/comsat.c: Use MU configuration and acls.
      * comsat/comsat.h: Include acl.h
      * libproto/maildir/mbox.c (maildir_qfetch): Bugfix.
      Sergey Poznyakoff authored
    • * frm/testsuite/frm/test.exp: Call mu_init with -noflags option.
      Use --mail-folder option when necessary.
      * messages/testsuite/messages/test.exp: Likewise.
      * readmsg/testsuite/readmsg/test.exp: Likewise.
      * sieve/testsuite/lib/sieve.exp: Likewise.
      * sieve/testsuite/sieve/action.exp: Likewise.
      * sieve/testsuite/scripts/fileinto.sv: Use +file, instead of
      %file.
      
      * imap4d/imap4d.c: Register mailbox formats before parsing
      configuration.
      * imap4d/util.c (util_wcard_match): Replaced with a more efficient
      implementation, based on wildmat from GNU Radius.
      * imap4d/testsuite/imap4d/list.exp: Expect two non-mailbox files
      to appear in the list output (see libproto/mbox/folder.c, 2007-12-28).
      
      * libargp/common.c: New option --mail-folder.
      * libcfg/common.c: New statement mailbox/folder
      
      * libproto/maildir/folder.c (_maildir_is_scheme): Never return
      MU_FOLDER_ATTRIBUTE_DIRECTORY bit: maildir folders cannot contain
      subfolders.
      * libproto/maildir/mbox.c (maildir_msg_init): Bugfix: use full
      file name.
      Print additional diagnostics if stat fails.
      * libproto/mbox/folder.c (list_helper): Take additional argument,
      record, specifying a mu_record_t object to match entries
      against. If it is NULL, mu_registrar_lookup is used.
      Fix descending into subdirectories.
      
      * maidag/deliver.c (deliver): Split off deliver_to_user function;
      call it with user privileges. This fixes privileges of any created
      maildir folders.
      * maidag/maidag.c (set_debug_flags): Bugfix.
      
      * mail/mail.c (main): Open the mailbox with MU_STREAM_CREAT flag.
      
      * mailbox/amd.c (amd_open): Do not initialize amd->mtime to
      trigger initial scanning.
      (_amd_message_save): Check rename return value.
      (amd_is_updated): Do not check for msg_count==0, rely on the
      timestamp.
      
      * mailbox/mailbox.c (mu_mailbox_set_default_proto): Accept an
      argument without trailing semicolon.
      * mailbox/mbx_default.c (mu_set_mail_directory): Accept NULL
      argument.
      (mu_set_mailbox_pattern): Likewise.
      (mu_mailbox_create_default): Use FOLDER or MAIL environment
      variables only if _mu_mailbox_pattern is not set. In other words,
      setting mail-spool in the configuration file overrides these
      variables.
      Sergey Poznyakoff authored
  18. 28 Dec, 2007 1 commit
    • appear in any local URLs.
      
      * TODO, NEWS: Update.
      
      * examples/url-parse.c: Print field/value pairs.
      * include/mailutils/argcv.h (MU_ARGCV_RETURN_DELIMS): New macro.
      (mu_argcv_get_np): New function.
      (mu_argcv_remove): New function.
      * include/mailutils/mutil.h (mu_scheme_autodetect_p): Change
      prototype.
      * include/mailutils/registrar.h (mu_registrar_lookup_url): New
      function.
      (struct _mu_record._is_scheme): Change signature.
      * include/mailutils/url.h (mu_url_sget_fvpairs)
      (mu_url_aget_fvpairs): New functions.
      (mu_url_expand_path): New function.
      
      * libproto/imap/folder.c (folder_imap_list): Fix signature.
      * libproto/nntp/folder.c (nntp_folder_list): Fix signature.
      * libproto/include/amd.h (amd_url_init): Remove.
      * libproto/include/registrar0.h: Fix scheme defines.
      * libproto/include/url0.h (struct _mu_url.fvpairs,fvcount): New
      members.
      * libproto/maildir/folder.c (_maildir_is_scheme): Change
      signature.
      (_maildir_url_init): Remove
      (_maildir_record): Remove url_init.
      * libproto/mbox/folder.c (_path_record): Remove url_init.
      (_mbox_record): Use mu_url_expand_path as url_init.
      (_path_is_scheme): Change signature.
      * libproto/mh/folder.c (_mh_is_scheme): Change signature.
      (_mh_url_init): Remove.
      (_mh_record): Use mu_url_expand_path as url_init.
      * libproto/mbox/Makefile.am (libmu_mbox_la_SOURCES): Remove url.c
      * libproto/mbox/url.c: Remove.
      
      * mail/mail.h, mail/util.c (util_url_to_string): New function.
      * mail/quit.c, mail/summary.c: Use util_url_to_string where
      appropriate.
      * mailbox/amd.c (amd_url_destroy, amd_url_init): Remove.
      * mailbox/argcv.c (mu_argcv_get_np): New function.
      (argcv_scan): Change signature. All callers updated.
      (argcv_get_n): Rewrite using argcv_get_np.
      (mu_argcv_remove): New function.
      
      * mailbox/file_stream.c (struct _prog_stream.argc): Fix data type.
      * mailbox/folder.c (mu_folder_create_from_record): URL initializer
      is optional.
      * mailbox/gdebug.c (mu_global_debug_from_string): Fix datatype of
      argc.
      * mailbox/mailbox.c (mailbox_folder_create): Rewrite.
      (_create_mailbox): Split off _create_mailbox0 function.
      Make URL initializer optional.
      * mailbox/mutil.c (mu_scheme_autodetect_p): Rewrite.
      * mailbox/registrar.c (mu_registrar_lookup_url): New function.
      (mu_registrar_lookup): Rewrite using mu_registrar_lookup_url.
      (mu_record_is_scheme,mu_record_set_is_scheme): Change signature.
      * mailbox/url.c (mu_url_destroy): Destroy fvpairs.
      (url_parse0): Use scheme "file" for URLs beginning with a /.
      Parse parameters.
      (mu_url_sget_fvpairs, mu_url_aget_fvpairs): New functions.
      (mu_url_expand_path): New function.
      * mailbox/testsuite/Urls: Update.
      
      * pop3d/bulletin.c (set_bulletin_db,set_bulletin_source): Allocate
      string storage.
      (read_bulletin_db): Return 0 if no record was found.
      (get_last_delivered_num): Return error code.
      (deliver_pending_bulletins): Rewrite.
      * pop3d/capa.c (pop3d_capa): Bugfix.
      Sergey Poznyakoff authored
  19. 21 Dec, 2007 2 commits
    • Sergey Poznyakoff authored
    • speed up.
      * imap4d/imap4d.h (WCARD_NOMATCH,WCARD_MATCH)
      (WCARD_RECURSE_MATCH): Remove.
      * imap4d/list.c: Rewrite using mu_folder_enumerate.
      * imap4d/lsub.c (imap4d_lsub): Fix call to util_wcard_match.
      * imap4d/util.c (util_wcard_match): Return 0 for match, 1
      otherwise.
      * imap4d/testsuite/imap4d/list.exp: Fix two testcases to match
      the new (stricter RFC-compliant) behavior.
      * include/mailutils/folder.h (mu_folder_match_fp): New typedef.
      (mu_folder_enumerate_fp): New typedef.
      (mu_folder_enumerate): New function.
      (mu_folder_set_match, mu_folder_get_match): New functions.
      
      * libproto/imap/folder.c, libproto/include/imap0.h,
      libproto/nntp/folder.c : Use new folder list framework.
      * libproto/include/folder0.h (struct _mu_folder._list): Change
      signature.
      (_match): New member.
      * libproto/mbox/folder.c (_path_is_scheme): Improve automatic
      mailbox	format detection.
      (folder_mbox_list): Do not use glob, recursively scan
      subdirectories instead.
      * mailbox/folder.c (mu_folder_match): New function.
      (mu_folder_create_from_record): Set mu_folder_match as the default
      matcher.
      (mu_folder_set_match, mu_folder_get_match): New functions.
      (mu_folder_enumerate): New function.
      (mu_folder_list): Rewrite using mu_folder_enumerate.
      Sergey Poznyakoff authored