[U-Boot] [PATCH "mkimage" branch] tools/mkimage: fix compiler warnings, use "const"

This fixes some compiler warnings: tools/default_image.c:141: warning: initialization from incompatible pointer type tools/fit_image.c:202: warning: initialization from incompatible pointer type and changes to code to use "const" attributes in a few places where it's appropriate.
Signed-off-by: Wolfgang Denk wd@denx.de --- common/image.c | 39 ++++++++++++++++++++------------------- include/image.h | 34 +++++++++++++++++----------------- tools/mkimage.h | 2 +- 3 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/common/image.c b/common/image.c index e22c974..f3dd647 100644 --- a/common/image.c +++ b/common/image.c @@ -65,7 +65,7 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
DECLARE_GLOBAL_DATA_PTR;
-static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify); #else #include "mkimage.h" @@ -166,7 +166,7 @@ static void genimg_print_time (time_t timestamp); /*****************************************************************************/ /* Legacy format routines */ /*****************************************************************************/ -int image_check_hcrc (image_header_t *hdr) +int image_check_hcrc (const image_header_t *hdr) { ulong hcrc; ulong len = image_get_header_size (); @@ -181,7 +181,7 @@ int image_check_hcrc (image_header_t *hdr) return (hcrc == image_get_hcrc (hdr)); }
-int image_check_dcrc (image_header_t *hdr) +int image_check_dcrc (const image_header_t *hdr) { ulong data = image_get_data (hdr); ulong len = image_get_data_size (hdr); @@ -203,7 +203,7 @@ int image_check_dcrc (image_header_t *hdr) * returns: * number of components */ -ulong image_multi_count (image_header_t *hdr) +ulong image_multi_count (const image_header_t *hdr) { ulong i, count = 0; uint32_t *size; @@ -236,7 +236,7 @@ ulong image_multi_count (image_header_t *hdr) * data address and size of the component, if idx is valid * 0 in data and len, if idx is out of range */ -void image_multi_getimg (image_header_t *hdr, ulong idx, +void image_multi_getimg (const image_header_t *hdr, ulong idx, ulong *data, ulong *len) { int i; @@ -272,7 +272,7 @@ void image_multi_getimg (image_header_t *hdr, ulong idx, } }
-static void image_print_type (image_header_t *hdr) +static void image_print_type (const image_header_t *hdr) { const char *os, *arch, *type, *comp;
@@ -286,7 +286,7 @@ static void image_print_type (image_header_t *hdr)
/** * image_print_contents - prints out the contents of the legacy format image - * @hdr: pointer to the legacy format image header + * @ptr: pointer to the legacy format image header * @p: pointer to prefix string * * image_print_contents() formats a multi line legacy image contents description. @@ -296,8 +296,9 @@ static void image_print_type (image_header_t *hdr) * returns: * no returned results */ -void image_print_contents (image_header_t *hdr) +void image_print_contents (const void *ptr) { + const image_header_t *hdr = (const image_header_t *)ptr; const char *p;
#ifdef USE_HOSTCC @@ -363,10 +364,10 @@ void image_print_contents (image_header_t *hdr) * pointer to a ramdisk image header, if image was found and valid * otherwise, return NULL */ -static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t *image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify) { - image_header_t *rd_hdr = (image_header_t *)rd_addr; + const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
if (!image_check_magic (rd_hdr)) { puts ("Bad Magic Number\n"); @@ -628,13 +629,13 @@ int genimg_get_comp_id (const char *name) */ int genimg_get_format (void *img_addr) { - ulong format = IMAGE_FORMAT_INVALID; - image_header_t *hdr; + ulong format = IMAGE_FORMAT_INVALID; + const image_header_t *hdr; #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) - char *fit_hdr; + char *fit_hdr; #endif
- hdr = (image_header_t *)img_addr; + hdr = (const image_header_t *)img_addr; if (image_check_magic(hdr)) format = IMAGE_FORMAT_LEGACY; #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) @@ -685,7 +686,7 @@ ulong genimg_get_image (ulong img_addr) /* get data size */ switch (genimg_get_format ((void *)ram_addr)) { case IMAGE_FORMAT_LEGACY: - d_size = image_get_data_size ((image_header_t *)ram_addr); + d_size = image_get_data_size ((const image_header_t *)ram_addr); debug (" Legacy format image found at 0x%08lx, size 0x%08lx\n", ram_addr, d_size); break; @@ -762,7 +763,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, { ulong rd_addr, rd_load; ulong rd_data, rd_len; - image_header_t *rd_hdr; + const image_header_t *rd_hdr; #if defined(CONFIG_FIT) void *fit_hdr; const char *fit_uname_config = NULL; @@ -1085,9 +1086,9 @@ static void fdt_error (const char *msg) puts (" - must RESET the board to recover.\n"); }
-static image_header_t *image_get_fdt (ulong fdt_addr) +static const image_header_t *image_get_fdt (ulong fdt_addr) { - image_header_t *fdt_hdr = (image_header_t *)fdt_addr; + const image_header_t *fdt_hdr = (const image_header_t *)fdt_addr;
image_print_contents (fdt_hdr);
@@ -1283,8 +1284,8 @@ error: int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images, char **of_flat_tree, ulong *of_size) { + const image_header_t *fdt_hdr; ulong fdt_addr; - image_header_t *fdt_hdr; char *fdt_blob = NULL; ulong image_start, image_end; ulong load_start, load_end; diff --git a/include/image.h b/include/image.h index beb3a16..a62669f 100644 --- a/include/image.h +++ b/include/image.h @@ -333,7 +333,7 @@ static inline uint32_t image_get_header_size (void) }
#define image_get_hdr_l(f) \ - static inline uint32_t image_get_##f(image_header_t *hdr) \ + static inline uint32_t image_get_##f(const image_header_t *hdr) \ { \ return uimage_to_cpu (hdr->ih_##f); \ } @@ -346,7 +346,7 @@ image_get_hdr_l (ep); /* image_get_ep */ image_get_hdr_l (dcrc); /* image_get_dcrc */
#define image_get_hdr_b(f) \ - static inline uint8_t image_get_##f(image_header_t *hdr) \ + static inline uint8_t image_get_##f(const image_header_t *hdr) \ { \ return hdr->ih_##f; \ } @@ -355,12 +355,12 @@ image_get_hdr_b (arch); /* image_get_arch */ image_get_hdr_b (type); /* image_get_type */ image_get_hdr_b (comp); /* image_get_comp */
-static inline char *image_get_name (image_header_t *hdr) +static inline char *image_get_name (const image_header_t *hdr) { return (char *)hdr->ih_name; }
-static inline uint32_t image_get_data_size (image_header_t *hdr) +static inline uint32_t image_get_data_size (const image_header_t *hdr) { return image_get_size (hdr); } @@ -376,16 +376,16 @@ static inline uint32_t image_get_data_size (image_header_t *hdr) * returns: * image payload data start address */ -static inline ulong image_get_data (image_header_t *hdr) +static inline ulong image_get_data (const image_header_t *hdr) { return ((ulong)hdr + image_get_header_size ()); }
-static inline uint32_t image_get_image_size (image_header_t *hdr) +static inline uint32_t image_get_image_size (const image_header_t *hdr) { return (image_get_size (hdr) + image_get_header_size ()); } -static inline ulong image_get_image_end (image_header_t *hdr) +static inline ulong image_get_image_end (const image_header_t *hdr) { return ((ulong)hdr + image_get_image_size (hdr)); } @@ -418,8 +418,8 @@ static inline void image_set_name (image_header_t *hdr, const char *name) strncpy (image_get_name (hdr), name, IH_NMLEN); }
-int image_check_hcrc (image_header_t *hdr); -int image_check_dcrc (image_header_t *hdr); +int image_check_hcrc (const image_header_t *hdr); +int image_check_dcrc (const image_header_t *hdr); #ifndef USE_HOSTCC int getenv_yesno (char *var); ulong getenv_bootm_low(void); @@ -427,31 +427,31 @@ phys_size_t getenv_bootm_size(void); void memmove_wd (void *to, void *from, size_t len, ulong chunksz); #endif
-static inline int image_check_magic (image_header_t *hdr) +static inline int image_check_magic (const image_header_t *hdr) { return (image_get_magic (hdr) == IH_MAGIC); } -static inline int image_check_type (image_header_t *hdr, uint8_t type) +static inline int image_check_type (const image_header_t *hdr, uint8_t type) { return (image_get_type (hdr) == type); } -static inline int image_check_arch (image_header_t *hdr, uint8_t arch) +static inline int image_check_arch (const image_header_t *hdr, uint8_t arch) { return (image_get_arch (hdr) == arch); } -static inline int image_check_os (image_header_t *hdr, uint8_t os) +static inline int image_check_os (const image_header_t *hdr, uint8_t os) { return (image_get_os (hdr) == os); }
-ulong image_multi_count (image_header_t *hdr); -void image_multi_getimg (image_header_t *hdr, ulong idx, +ulong image_multi_count (const image_header_t *hdr); +void image_multi_getimg (const image_header_t *hdr, ulong idx, ulong *data, ulong *len);
-void image_print_contents (image_header_t *hdr); +void image_print_contents (const void *hdr);
#ifndef USE_HOSTCC -static inline int image_check_target_arch (image_header_t *hdr) +static inline int image_check_target_arch (const image_header_t *hdr) { #if defined(__ARM__) if (!image_check_arch (hdr, IH_ARCH_ARM)) diff --git a/tools/mkimage.h b/tools/mkimage.h index a9295b6..1e92825 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -105,7 +105,7 @@ struct image_type_params { */ int (*verify_header) (unsigned char *, int, struct mkimage_params *); /* Prints image information abstracting from image header */ - void (*print_header) (void *); + void (*print_header) (const void *); /* * The header or image contents need to be set as per image type to * be generated using this callback function.

-----Original Message----- From: u-boot-bounces@lists.denx.de [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Wolfgang Denk Sent: Wednesday, August 19, 2009 3:24 PM To: u-boot@lists.denx.de Subject: [U-Boot] [PATCH "mkimage" branch] tools/mkimage: fix compiler warnings, use "const"
This fixes some compiler warnings: tools/default_image.c:141: warning: initialization from incompatible pointer type tools/fit_image.c:202: warning: initialization from incompatible pointer type and changes to code to use "const" attributes in a few places where it's appropriate.
Dear Wolfgang 99% of the changes in this patch is to add const attributes. Can you pls explain here- how useful it is to add const. Or do it make more sense just to fix the warnings in respective functions? I have posted a patch for the same
For ex.
Regards.. Prafulla . .
Signed-off-by: Wolfgang Denk wd@denx.de
common/image.c | 39 ++++++++++++++++++++------------------- include/image.h | 34 +++++++++++++++++----------------- tools/mkimage.h | 2 +- 3 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/common/image.c b/common/image.c index e22c974..f3dd647 100644 --- a/common/image.c +++ b/common/image.c @@ -65,7 +65,7 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
DECLARE_GLOBAL_DATA_PTR;
-static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify); #else #include "mkimage.h" @@ -166,7 +166,7 @@ static void genimg_print_time (time_t timestamp);
/************************************************************* ****************/ /* Legacy format routines */
/************************************************************* ****************/ -int image_check_hcrc (image_header_t *hdr) +int image_check_hcrc (const image_header_t *hdr) { ulong hcrc; ulong len = image_get_header_size (); @@ -181,7 +181,7 @@ int image_check_hcrc (image_header_t *hdr) return (hcrc == image_get_hcrc (hdr)); }
-int image_check_dcrc (image_header_t *hdr) +int image_check_dcrc (const image_header_t *hdr) { ulong data = image_get_data (hdr); ulong len = image_get_data_size (hdr); @@ -203,7 +203,7 @@ int image_check_dcrc (image_header_t *hdr)
- returns:
number of components
*/ -ulong image_multi_count (image_header_t *hdr) +ulong image_multi_count (const image_header_t *hdr) { ulong i, count = 0; uint32_t *size; @@ -236,7 +236,7 @@ ulong image_multi_count (image_header_t *hdr)
data address and size of the component, if idx is valid
0 in data and len, if idx is out of range
*/ -void image_multi_getimg (image_header_t *hdr, ulong idx, +void image_multi_getimg (const image_header_t *hdr, ulong idx, ulong *data, ulong *len) { int i; @@ -272,7 +272,7 @@ void image_multi_getimg (image_header_t *hdr, ulong idx, } }
-static void image_print_type (image_header_t *hdr) +static void image_print_type (const image_header_t *hdr) { const char *os, *arch, *type, *comp;
@@ -286,7 +286,7 @@ static void image_print_type (image_header_t *hdr)
/**
- image_print_contents - prints out the contents of the
legacy format image
- @hdr: pointer to the legacy format image header
- @ptr: pointer to the legacy format image header
- @p: pointer to prefix string
- image_print_contents() formats a multi line legacy image
contents description. @@ -296,8 +296,9 @@ static void image_print_type (image_header_t *hdr)
- returns:
no returned results
*/ -void image_print_contents (image_header_t *hdr) +void image_print_contents (const void *ptr) {
- const image_header_t *hdr = (const image_header_t *)ptr; const char *p;
#ifdef USE_HOSTCC @@ -363,10 +364,10 @@ void image_print_contents (image_header_t *hdr)
pointer to a ramdisk image header, if image was found
and valid
otherwise, return NULL
*/ -static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch, +static const image_header_t *image_get_ramdisk (ulong rd_addr, uint8_t arch, int verify) {
- image_header_t *rd_hdr = (image_header_t *)rd_addr;
const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
if (!image_check_magic (rd_hdr)) { puts ("Bad Magic Number\n");
@@ -628,13 +629,13 @@ int genimg_get_comp_id (const char *name) */ int genimg_get_format (void *img_addr) {
- ulong format = IMAGE_FORMAT_INVALID;
- image_header_t *hdr;
- ulong format = IMAGE_FORMAT_INVALID;
- const image_header_t *hdr;
#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
- char *fit_hdr;
- char *fit_hdr;
#endif
- hdr = (image_header_t *)img_addr;
- hdr = (const image_header_t *)img_addr; if (image_check_magic(hdr)) format = IMAGE_FORMAT_LEGACY;
#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) @@ -685,7 +686,7 @@ ulong genimg_get_image (ulong img_addr) /* get data size */ switch (genimg_get_format ((void *)ram_addr)) { case IMAGE_FORMAT_LEGACY:
d_size = image_get_data_size
((image_header_t *)ram_addr);
d_size = image_get_data_size ((const
image_header_t *)ram_addr); debug (" Legacy format image found at 0x%08lx, size 0x%08lx\n", ram_addr, d_size); break; @@ -762,7 +763,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images, { ulong rd_addr, rd_load; ulong rd_data, rd_len;
- image_header_t *rd_hdr;
- const image_header_t *rd_hdr;
#if defined(CONFIG_FIT) void *fit_hdr; const char *fit_uname_config = NULL; @@ -1085,9 +1086,9 @@ static void fdt_error (const char *msg) puts (" - must RESET the board to recover.\n"); }
-static image_header_t *image_get_fdt (ulong fdt_addr) +static const image_header_t *image_get_fdt (ulong fdt_addr) {
- image_header_t *fdt_hdr = (image_header_t *)fdt_addr;
- const image_header_t *fdt_hdr = (const image_header_t
*)fdt_addr;
image_print_contents (fdt_hdr);
@@ -1283,8 +1284,8 @@ error: int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images, char **of_flat_tree, ulong *of_size) {
- const image_header_t *fdt_hdr; ulong fdt_addr;
- image_header_t *fdt_hdr; char *fdt_blob = NULL; ulong image_start, image_end; ulong load_start, load_end;
diff --git a/include/image.h b/include/image.h index beb3a16..a62669f 100644 --- a/include/image.h +++ b/include/image.h @@ -333,7 +333,7 @@ static inline uint32_t image_get_header_size (void) }
#define image_get_hdr_l(f) \
- static inline uint32_t image_get_##f(image_header_t *hdr) \
- static inline uint32_t image_get_##f(const
image_header_t *hdr) \ { \ return uimage_to_cpu (hdr->ih_##f); \ } @@ -346,7 +346,7 @@ image_get_hdr_l (ep); /* image_get_ep */ image_get_hdr_l (dcrc); /* image_get_dcrc */
#define image_get_hdr_b(f) \
- static inline uint8_t image_get_##f(image_header_t *hdr) \
- static inline uint8_t image_get_##f(const image_header_t *hdr) \ { \ return hdr->ih_##f; \ }
@@ -355,12 +355,12 @@ image_get_hdr_b (arch); /* image_get_arch */ image_get_hdr_b (type); /* image_get_type */ image_get_hdr_b (comp); /* image_get_comp */
-static inline char *image_get_name (image_header_t *hdr) +static inline char *image_get_name (const image_header_t *hdr) { return (char *)hdr->ih_name; }
-static inline uint32_t image_get_data_size (image_header_t *hdr) +static inline uint32_t image_get_data_size (const image_header_t *hdr) { return image_get_size (hdr); } @@ -376,16 +376,16 @@ static inline uint32_t image_get_data_size (image_header_t *hdr)
- returns:
image payload data start address
*/ -static inline ulong image_get_data (image_header_t *hdr) +static inline ulong image_get_data (const image_header_t *hdr) { return ((ulong)hdr + image_get_header_size ()); }
-static inline uint32_t image_get_image_size (image_header_t *hdr) +static inline uint32_t image_get_image_size (const image_header_t *hdr) { return (image_get_size (hdr) + image_get_header_size ()); } -static inline ulong image_get_image_end (image_header_t *hdr) +static inline ulong image_get_image_end (const image_header_t *hdr) { return ((ulong)hdr + image_get_image_size (hdr)); } @@ -418,8 +418,8 @@ static inline void image_set_name (image_header_t *hdr, const char *name) strncpy (image_get_name (hdr), name, IH_NMLEN); }
-int image_check_hcrc (image_header_t *hdr); -int image_check_dcrc (image_header_t *hdr); +int image_check_hcrc (const image_header_t *hdr); +int image_check_dcrc (const image_header_t *hdr); #ifndef USE_HOSTCC int getenv_yesno (char *var); ulong getenv_bootm_low(void); @@ -427,31 +427,31 @@ phys_size_t getenv_bootm_size(void); void memmove_wd (void *to, void *from, size_t len, ulong chunksz); #endif
-static inline int image_check_magic (image_header_t *hdr) +static inline int image_check_magic (const image_header_t *hdr) { return (image_get_magic (hdr) == IH_MAGIC); } -static inline int image_check_type (image_header_t *hdr, uint8_t type) +static inline int image_check_type (const image_header_t *hdr, uint8_t type) { return (image_get_type (hdr) == type); } -static inline int image_check_arch (image_header_t *hdr, uint8_t arch) +static inline int image_check_arch (const image_header_t *hdr, uint8_t arch) { return (image_get_arch (hdr) == arch); } -static inline int image_check_os (image_header_t *hdr, uint8_t os) +static inline int image_check_os (const image_header_t *hdr, uint8_t os) { return (image_get_os (hdr) == os); }
-ulong image_multi_count (image_header_t *hdr); -void image_multi_getimg (image_header_t *hdr, ulong idx, +ulong image_multi_count (const image_header_t *hdr); +void image_multi_getimg (const image_header_t *hdr, ulong idx, ulong *data, ulong *len);
-void image_print_contents (image_header_t *hdr); +void image_print_contents (const void *hdr);
#ifndef USE_HOSTCC -static inline int image_check_target_arch (image_header_t *hdr) +static inline int image_check_target_arch (const image_header_t *hdr) { #if defined(__ARM__) if (!image_check_arch (hdr, IH_ARCH_ARM)) diff --git a/tools/mkimage.h b/tools/mkimage.h index a9295b6..1e92825 100644 --- a/tools/mkimage.h +++ b/tools/mkimage.h @@ -105,7 +105,7 @@ struct image_type_params { */ int (*verify_header) (unsigned char *, int, struct mkimage_params *); /* Prints image information abstracting from image header */
- void (*print_header) (void *);
- void (*print_header) (const void *); /*
- The header or image contents need to be set as per
image type to * be generated using this callback function. -- 1.6.0.6
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

Dear Prafulla,
In message 73173D32E9439E4ABB5151606C3E19E202E3915996@SC-VEXCH1.marvell.com you wrote:
This fixes some compiler warnings: tools/default_image.c:141: warning: initialization from incompatible pointer type tools/fit_image.c:202: warning: initialization from incompatible pointer type and changes to code to use "const" attributes in a few places where it's appropriate.
99% of the changes in this patch is to add const attributes.
Yes, indeed.
Can you pls explain here- how useful it is to add const.
Well, adding "const" where appropriate is definitely a good thing, as it const augments data-hiding and encapsulation and allows the compiler to check for (and prevent!) unintended modification of data structures, i. e. for programming errors. Also, it helps the compiler for better optimization.
Or do it make more sense just to fix the warnings in respective functions? I have posted a patch for the same
I did not see any patch form you addressing these warnings?
My "const"-adding patch was the more or less direct result of getting rid of the warnings without using additional type casts.
I think using const is a good thing. I am aware that it sometimes becomes painful, and some consider it a waste of time.
Best regards,
Wolfgang Denk

-----Original Message----- From: Wolfgang Denk [mailto:wd@denx.de] Sent: Thursday, August 20, 2009 2:58 PM To: Prafulla Wadaskar Cc: u-boot@lists.denx.de Subject: Re: [U-Boot] [PATCH "mkimage" branch] tools/mkimage: fix compiler warnings, use "const"
Dear Prafulla,
In message <73173D32E9439E4ABB5151606C3E19E202E3915996@SC-VEXCH1.marvell. com> you wrote:
This fixes some compiler warnings: tools/default_image.c:141: warning: initialization from incompatible pointer type tools/fit_image.c:202: warning: initialization from incompatible pointer type and changes to code to use "const" attributes in a few
places where
it's appropriate.
99% of the changes in this patch is to add const attributes.
Yes, indeed.
Can you pls explain here- how useful it is to add const.
Well, adding "const" where appropriate is definitely a good thing, as it const augments data-hiding and encapsulation and allows the compiler to check for (and prevent!) unintended modification of data structures, i. e. for programming errors. Also, it helps the compiler for better optimization.
Ack
Or do it make more sense just to fix the warnings in
respective functions?
I have posted a patch for the same
I did not see any patch form you addressing these warnings?
It's in my mailq :-(, I will repost it just FYI
Regards.. Prafulla . .

In message 1250675656-12022-1-git-send-email-wd@denx.de you wrote:
This fixes some compiler warnings: tools/default_image.c:141: warning: initialization from incompatible pointer type tools/fit_image.c:202: warning: initialization from incompatible pointer type and changes to code to use "const" attributes in a few places where it's appropriate.
Signed-off-by: Wolfgang Denk wd@denx.de
common/image.c | 39 ++++++++++++++++++++------------------- include/image.h | 34 +++++++++++++++++----------------- tools/mkimage.h | 2 +- 3 files changed, 38 insertions(+), 37 deletions(-)
Applied to "mkimage" branch.
Best regards,
Wolfgang Denk
participants (2)
-
Prafulla Wadaskar
-
Wolfgang Denk