* Add strnlen()
@ 2010-05-11 16:17 Jonathan Larmour
2010-05-11 16:26 ` Jonathan Larmour
2010-05-12 10:21 ` Reminder: strlcat/strlcpy (was: Add strnlen()) Daniel Néri
0 siblings, 2 replies; 4+ messages in thread
From: Jonathan Larmour @ 2010-05-11 16:17 UTC (permalink / raw)
To: eCos Patches List
[-- Attachment #1: Type: text/plain, Size: 215 bytes --]
Ross Younger sent this addition of strnlen() to me off-list for review,
and after some feedback, I said it was ok, so here it is.
Jifl
--
--["No sense being pessimistic, it wouldn't work anyway"]-- Opinions==mine
[-- Attachment #2: wrypat.txt --]
[-- Type: text/plain, Size: 4341 bytes --]
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/ChangeLog,v
retrieving revision 1.11
diff -u -5 -p -r1.11 ChangeLog
--- ChangeLog 29 Jan 2009 17:49:53 -0000 1.11
+++ ChangeLog 11 May 2010 16:13:52 -0000
@@ -1,5 +1,9 @@
+2010-05-10 Ross Younger <wry@ecoscentric.com>
+
+ * src/strnlen.cxx, tests/strnlen.c: Created.
+
2009-01-26 Jonathan Larmour <jifl@eCosCentric.com>
* tests/memchr.c (main): Rename to cyg_user_start if main isn't
going to be called.
* tests/memcmp1.c (main): Ditto.
Index: cdl/string.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/cdl/string.cdl,v
retrieving revision 1.8
diff -u -5 -p -r1.8 string.cdl
--- cdl/string.cdl 29 Jan 2009 17:49:53 -0000 1.8
+++ cdl/string.cdl 11 May 2010 16:13:52 -0000
@@ -164,10 +164,20 @@ cdl_package CYGPKG_LIBC_STRING {
compile strdup.cxx
description "
This option indicates whether strdup() is to be supported."
}
+ cdl_option CYGFUN_LIBC_STRING_GNU_STRNLEN {
+ display "Provide strnlen() GNU extension"
+ flavor bool
+ default_value 1
+ compile strnlen.cxx
+ description "
+ This option controls support for the strnlen() function.
+ (This is a GNU extension, not part of ANSI C.)"
+ }
+
cdl_component CYGPKG_LIBC_STRING_OPTIONS {
display "C library string functions build options"
flavor none
no_define
description "
@@ -200,11 +210,11 @@ cdl_package CYGPKG_LIBC_STRING {
cdl_option CYGPKG_LIBC_STRING_TESTS {
display "C library string function tests"
flavor data
no_define
- calculated { "tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2" }
+ calculated { "tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2 tests/strnlen" }
description "
This option specifies the set of tests for the C library
string functions."
}
}
Index: include/string.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/include/string.h,v
retrieving revision 1.5
diff -u -5 -p -r1.5 string.h
--- include/string.h 29 Jan 2009 17:49:53 -0000 1.5
+++ include/string.h 11 May 2010 16:13:52 -0000
@@ -153,10 +153,16 @@ strlen( const char * );
#ifndef __STRICT_ANSI__
extern char *
strdup( const char * );
#endif
+// This is a GNU extension
+#ifdef CYGFUN_LIBC_STRING_GNU_STRNLEN
+extern size_t
+strnlen( const char *, size_t );
+#endif
+
#ifdef __cplusplus
} /* extern "C" */
#endif
/* INLINE FUNCTIONS */
Index: include/stringsupp.hxx
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/include/stringsupp.hxx,v
retrieving revision 1.5
diff -u -5 -p -r1.5 stringsupp.hxx
--- include/stringsupp.hxx 29 Jan 2009 17:49:53 -0000 1.5
+++ include/stringsupp.hxx 11 May 2010 16:13:52 -0000
@@ -210,8 +210,14 @@ __strlen( const char * );
// NB This is a BSD function
__externC char *
__strdup( const char * );
+// NB This is a GNU extension
+#ifdef CYGFUN_LIBC_STRING_GNU_STRNLEN
+__externC size_t
+__strnlen( const char *, size_t );
+#endif
+
#endif // CYGONCE_LIBC_STRING_STRINGSUPP_HXX multiple inclusion protection
// EOF stringsupp.hxx
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Add strnlen()
2010-05-11 16:17 Add strnlen() Jonathan Larmour
@ 2010-05-11 16:26 ` Jonathan Larmour
2010-05-12 10:21 ` Reminder: strlcat/strlcpy (was: Add strnlen()) Daniel Néri
1 sibling, 0 replies; 4+ messages in thread
From: Jonathan Larmour @ 2010-05-11 16:26 UTC (permalink / raw)
To: eCos Patches List
[-- Attachment #1: Type: text/plain, Size: 311 bytes --]
On 11/05/10 17:16, Jonathan Larmour wrote:
> Ross Younger sent this addition of strnlen() to me off-list for review,
> and after some feedback, I said it was ok, so here it is.
[Once more with feeling]
In fact *here* it is.
Jifl
--
--["No sense being pessimistic, it wouldn't work anyway"]-- Opinions==mine
[-- Attachment #2: wrypat.txt --]
[-- Type: text/plain, Size: 14764 bytes --]
Index: ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/ChangeLog,v
retrieving revision 1.11
diff -u -5 -p -r1.11 ChangeLog
--- ChangeLog 29 Jan 2009 17:49:53 -0000 1.11
+++ ChangeLog 11 May 2010 16:23:29 -0000
@@ -1,5 +1,14 @@
+2010-05-10 Ross Younger <wry@ecoscentric.com>
+
+ * include/string.h: Declare strnlen.
+ * include/stringsupp.hxx: Declare __strnlen.
+ * src/strnlen.cxx, tests/strnlen.c: Created.
+ * cdl/string.cdl (CYGFUN_LIBC_STRING_GNU_STRNLEN): New option,
+ compiles strnlen.cxx.
+ (CYGPKG_LIBC_STRING_TESTS): Add strnlen test.
+
2009-01-26 Jonathan Larmour <jifl@eCosCentric.com>
* tests/memchr.c (main): Rename to cyg_user_start if main isn't
going to be called.
* tests/memcmp1.c (main): Ditto.
Index: cdl/string.cdl
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/cdl/string.cdl,v
retrieving revision 1.8
diff -u -5 -p -r1.8 string.cdl
--- cdl/string.cdl 29 Jan 2009 17:49:53 -0000 1.8
+++ cdl/string.cdl 11 May 2010 16:23:29 -0000
@@ -164,10 +164,20 @@ cdl_package CYGPKG_LIBC_STRING {
compile strdup.cxx
description "
This option indicates whether strdup() is to be supported."
}
+ cdl_option CYGFUN_LIBC_STRING_GNU_STRNLEN {
+ display "Provide strnlen() GNU extension"
+ flavor bool
+ default_value 1
+ compile strnlen.cxx
+ description "
+ This option controls support for the strnlen() function.
+ (This is a GNU extension, not part of ANSI C.)"
+ }
+
cdl_component CYGPKG_LIBC_STRING_OPTIONS {
display "C library string functions build options"
flavor none
no_define
description "
@@ -200,11 +210,11 @@ cdl_package CYGPKG_LIBC_STRING {
cdl_option CYGPKG_LIBC_STRING_TESTS {
display "C library string function tests"
flavor data
no_define
- calculated { "tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2" }
+ calculated { "tests/memchr tests/memcmp1 tests/memcmp2 tests/memcpy1 tests/memcpy2 tests/memmove1 tests/memmove2 tests/memset tests/strcat1 tests/strcat2 tests/strchr tests/strcmp1 tests/strcmp2 tests/strcoll1 tests/strcoll2 tests/strcpy1 tests/strcpy2 tests/strcspn tests/strcspn tests/strlen tests/strncat1 tests/strncat2 tests/strncpy1 tests/strncpy2 tests/strpbrk tests/strrchr tests/strspn tests/strstr tests/strtok tests/strxfrm1 tests/strxfrm2 tests/strnlen" }
description "
This option specifies the set of tests for the C library
string functions."
}
}
Index: include/string.h
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/include/string.h,v
retrieving revision 1.5
diff -u -5 -p -r1.5 string.h
--- include/string.h 29 Jan 2009 17:49:53 -0000 1.5
+++ include/string.h 11 May 2010 16:23:29 -0000
@@ -153,10 +153,18 @@ strlen( const char * );
#ifndef __STRICT_ANSI__
extern char *
strdup( const char * );
#endif
+// This is a GNU extension
+#ifndef __STRICT_ANSI__
+# ifdef CYGFUN_LIBC_STRING_GNU_STRNLEN
+extern size_t
+strnlen( const char *, size_t );
+# endif
+#endif
+
#ifdef __cplusplus
} /* extern "C" */
#endif
/* INLINE FUNCTIONS */
Index: include/stringsupp.hxx
===================================================================
RCS file: /cvs/ecos/ecos/packages/language/c/libc/string/current/include/stringsupp.hxx,v
retrieving revision 1.5
diff -u -5 -p -r1.5 stringsupp.hxx
--- include/stringsupp.hxx 29 Jan 2009 17:49:53 -0000 1.5
+++ include/stringsupp.hxx 11 May 2010 16:23:29 -0000
@@ -210,8 +210,16 @@ __strlen( const char * );
// NB This is a BSD function
__externC char *
__strdup( const char * );
+// NB This is a GNU extension
+#ifndef __STRICT_ANSI__
+# ifdef CYGFUN_LIBC_STRING_GNU_STRNLEN
+__externC size_t
+__strnlen( const char *, size_t );
+# endif
+#endif
+
#endif // CYGONCE_LIBC_STRING_STRINGSUPP_HXX multiple inclusion protection
// EOF stringsupp.hxx
Index: src/strnlen.cxx
===================================================================
RCS file: src/strnlen.cxx
diff -N src/strnlen.cxx
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/strnlen.cxx 11 May 2010 16:23:29 -0000
@@ -0,0 +1,134 @@
+//===========================================================================
+//
+// strnlen.cxx
+//
+// GNU extension strnlen() routine
+//
+//===========================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998-2010 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later
+// version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with eCos; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// As a special exception, if other files instantiate templates or use
+// macros or inline functions from this file, or you compile this file
+// and link it with other works to produce a work based on this file,
+// this file does not by itself cause the resulting work to be covered by
+// the GNU General Public License. However the source code for this file
+// must still be made available in accordance with section (3) of the GNU
+// General Public License v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): jlarmour, wry
+// Contributors:
+// Date: 2010-05-10
+// Purpose:
+// Description:
+// Usage:
+// Note: Derivative work of strlen.cxx.
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+
+// CONFIGURATION
+
+#include <pkgconf/libc_string.h> // Configuration header
+
+// INCLUDES
+
+#include <cyg/infra/cyg_type.h> // Common type definitions
+#include <cyg/infra/cyg_trac.h> // Tracing support
+#include <cyg/infra/cyg_ass.h> // Assertion support
+#include <string.h> // Header for this file
+#include <stddef.h> // Compiler definitions such as size_t, NULL etc.
+#include <cyg/libc/string/stringsupp.hxx> // Useful string function support and
+ // prototypes
+
+// EXPORTED SYMBOLS
+
+externC size_t
+strnlen( const char *s , size_t maxlen ) CYGBLD_ATTRIB_WEAK_ALIAS(__strnlen);
+
+// FUNCTIONS
+
+size_t
+__strnlen( const char *s , size_t maxlen )
+{
+ int retval;
+
+ CYG_REPORT_FUNCNAMETYPE( "__strnlen", "returning length %d" );
+ CYG_REPORT_FUNCARG1( "s=%08x", s );
+
+ CYG_CHECK_DATA_PTR( s, "s is not a valid pointer!" );
+
+#if defined(CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST) || defined(__OPTIMIZE_SIZE__)
+ const char *start = s;
+
+ while (*s && maxlen)
+ s++, maxlen--;
+
+ retval = s - start;
+
+ CYG_REPORT_RETVAL( retval );
+
+ return retval;
+
+#else
+
+ const char *start = s;
+ CYG_WORD *aligned_addr;
+
+ if (CYG_LIBC_STR_UNALIGNED (s))
+ {
+ while (*s && maxlen)
+ s++, maxlen--;
+ retval = s - start;
+
+ CYG_REPORT_RETVAL( retval );
+
+ return retval;
+ }
+
+ // If the string is word-aligned, we can check for the presence of
+ // a null in each word-sized block.
+
+ aligned_addr = (CYG_WORD *)s;
+ while (!CYG_LIBC_STR_DETECTNULL (*aligned_addr) && (maxlen>= sizeof(CYG_WORD)))
+ aligned_addr++, maxlen -= sizeof(CYG_WORD);
+
+ // Once a null is detected, we check each byte in that block for a
+ // precise position of the null.
+ s = (char*)aligned_addr;
+ while (*s && maxlen)
+ s++, maxlen--;
+ retval = s - start;
+
+ CYG_REPORT_RETVAL( retval );
+
+ return retval;
+#endif // not defined(CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST) ||
+ // defined(__OPTIMIZE_SIZE__)
+} // __strnlen()
+
+// EOF strnlen.cxx
Index: tests/strnlen.c
===================================================================
RCS file: tests/strnlen.c
diff -N tests/strnlen.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ tests/strnlen.c 11 May 2010 16:23:29 -0000
@@ -0,0 +1,133 @@
+//=================================================================
+//
+// strnlen.c
+//
+// Testcase for C library strnlen()
+//
+//=================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2010 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later
+// version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with eCos; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// As a special exception, if other files instantiate templates or use
+// macros or inline functions from this file, or you compile this file
+// and link it with other works to produce a work based on this file,
+// this file does not by itself cause the resulting work to be covered by
+// the GNU General Public License. However the source code for this file
+// must still be made available in accordance with section (3) of the GNU
+// General Public License v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//=================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s): wry
+// Contributors:
+// Date: 2010-05-10
+// Description: Testing for C library strnlen() function
+//
+//
+//####DESCRIPTIONEND####
+
+// INCLUDES
+
+#include <pkgconf/isoinfra.h>
+#include <string.h>
+#include <stdarg.h>
+#include <cyg/infra/testcase.h>
+#include <cyg/infra/diag.h>
+#include <cyg/infra/cyg_ass.h>
+#include <cyg/libc/string/stringsupp.hxx>
+
+
+// FUNCTIONS
+
+void test_guts(char *buf, size_t real_len, size_t arg, size_t expected, int *nfails, int *ncases)
+{
+#if 0
+ // printf takes too much memory on some boards.
+ //diag_printf("testcase: buf `%s', len %u, n %u, expect %u\n", buf, real_len, arg, expected);
+#endif
+ size_t rv = strnlen(buf, arg);
+ if (rv != expected) {
+ CYG_TEST_FAIL("incorrect answer from strnlen case");
+#if 0
+ diag_printf("incorrect answer %u from case %u:%u (expected %u)", rv, real_len, arg, expected);
+#endif
+ ++*nfails;
+ }
+ ++*ncases;
+}
+
+void test(size_t strsize, int * nfails, int * ncases)
+{
+ int j;
+ char testbuf[1024];
+
+ CYG_ASSERTC(strsize <= sizeof(testbuf));
+ // Insist on checking the aligned-path code.
+ CYG_ASSERTC(!(CYG_LIBC_STR_UNALIGNED(testbuf)));
+
+ memset(testbuf, 'A', strsize);
+ testbuf[strsize] = 0;
+
+ for (j=1; j<(1+4*sizeof(CYG_WORD)) && j<=strsize; j++) {
+ // condition `j<=strsize' prevents underflow.
+ test_guts(testbuf, strsize, strsize-j, strsize-j, nfails, ncases);
+ }
+ for (j=0; j<(1+4*sizeof(CYG_WORD)); j++) {
+ test_guts(testbuf, strsize, strsize+j, strsize, nfails, ncases);
+ }
+}
+
+
+#if CYGINT_ISO_MAIN_STARTUP
+int main( int argc, char *argv[] )
+#else
+void cyg_user_start(void)
+#endif
+{
+#ifndef CYGFUN_LIBC_STRING_GNU_STRNLEN
+ CYG_TEST_NA("strnlen / CYGFUN_LIBC_STRING_GNU_STRNLEN disabled");
+#else
+
+ CYG_TEST_INIT();
+ CYG_TEST_INFO("strnlen exhaustive testing");
+#if defined(CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST)
+ CYG_TEST_INFO("strnlen: NOTE: CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST is defined");
+#endif
+
+ int t, nfails=0, ncases=0;
+
+#define DO(x) do { test(x, &nfails, &ncases); } while(0)
+ for (t=0; t<40; t++) DO(t);
+
+#if 0
+ diag_printf("strnlen: %u/%u cases passed", (ncases-nfails), ncases);
+#endif
+ if (!nfails) CYG_TEST_PASS("strnlen");
+ CYG_TEST_FINISH("strnlen");
+
+#endif
+} // main()
+
+
+// EOF strlen.c
^ permalink raw reply [flat|nested] 4+ messages in thread
* Reminder: strlcat/strlcpy (was: Add strnlen())
2010-05-11 16:17 Add strnlen() Jonathan Larmour
2010-05-11 16:26 ` Jonathan Larmour
@ 2010-05-12 10:21 ` Daniel Néri
2010-05-12 13:04 ` Reminder: strlcat/strlcpy Jonathan Larmour
1 sibling, 1 reply; 4+ messages in thread
From: Daniel Néri @ 2010-05-12 10:21 UTC (permalink / raw)
To: ecos-patches
I'll take the opportunity to remind you about the patch I submitted more
than 6 years ago, adding the strlcat and strlcpy functions:
http://sourceware.org/ml/ecos-patches/2004-02/msg00035.html
These very useful replacements for strncat and strncpy are supported in
e.g. {Free,Net,Open}BSD, Mac OS X/Darwin and Solaris.
Regards,
Daniel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Reminder: strlcat/strlcpy
2010-05-12 10:21 ` Reminder: strlcat/strlcpy (was: Add strnlen()) Daniel Néri
@ 2010-05-12 13:04 ` Jonathan Larmour
0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Larmour @ 2010-05-12 13:04 UTC (permalink / raw)
To: Daniel Néri; +Cc: ecos-patches
Daniel Néri wrote:
> I'll take the opportunity to remind you about the patch I submitted more
> than 6 years ago, adding the strlcat and strlcpy functions:
>
> http://sourceware.org/ml/ecos-patches/2004-02/msg00035.html
>
> These very useful replacements for strncat and strncpy are supported in
> e.g. {Free,Net,Open}BSD, Mac OS X/Darwin and Solaris.
Heh, fair enough.
Would you mind updating it with these minor changes: update the copyright
dates, add eCos copyright headers to the two new files, and if you don't
mind while you're there, enclose the whole block of prototypes in
bsdstring.h in:
#ifndef __STRICT_ANSI__
Jifl
--
------["The best things in life aren't things."]------ Opinions==mine
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-05-12 13:04 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-11 16:17 Add strnlen() Jonathan Larmour
2010-05-11 16:26 ` Jonathan Larmour
2010-05-12 10:21 ` Reminder: strlcat/strlcpy (was: Add strnlen()) Daniel Néri
2010-05-12 13:04 ` Reminder: strlcat/strlcpy Jonathan Larmour
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).