chiark / gitweb /
Prep v228: Substitute declaration masks (2/4)
authorSven Eden <yamakuzure@gmx.net>
Tue, 11 Apr 2017 15:07:47 +0000 (17:07 +0200)
committerSven Eden <yamakuzure@gmx.net>
Wed, 26 Apr 2017 10:59:13 +0000 (12:59 +0200)
14 files changed:
src/basic/memfd-util.h
src/basic/mempool.c
src/basic/mempool.h
src/basic/mkdir.h
src/basic/mount-util.h
src/basic/parse-util.h
src/basic/path-util.h
src/basic/proc-cmdline.h
src/basic/process-util.h
src/basic/selinux-util.h
src/basic/set.h
src/basic/signal-util.h
src/basic/smack-util.h
src/basic/socket-util.h

index f2858be..8c1b24c 100644 (file)
 #include <inttypes.h>
 
 int memfd_new(const char *name);
-// UNNEEDED int memfd_new_and_map(const char *name, size_t sz, void **p);
-
-// UNNEEDED int memfd_map(int fd, uint64_t offset, size_t size, void **p);
+/// UNNEEDED by elogind
+#if 0
+int memfd_new_and_map(const char *name, size_t sz, void **p);
 
+int memfd_map(int fd, uint64_t offset, size_t size, void **p);
+#endif // 0
 int memfd_set_sealed(int fd);
-// UNNEEDED int memfd_get_sealed(int fd);
+/// UNNEEDED by elogind
+#if 0
+int memfd_get_sealed(int fd);
 
-// UNNEEDED int memfd_get_size(int fd, uint64_t *sz);
+int memfd_get_size(int fd, uint64_t *sz);
+#endif // 0
 int memfd_set_size(int fd, uint64_t sz);
index 4916361..9ee6e6a 100644 (file)
@@ -88,8 +88,6 @@ void mempool_free_tile(struct mempool *mp, void *p) {
         mp->freelist = p;
 }
 
-/// UNNEEDED by elogind
-#if 0
 #ifdef VALGRIND
 
 void mempool_drop(struct mempool *mp) {
@@ -103,4 +101,3 @@ void mempool_drop(struct mempool *mp) {
 }
 
 #endif
-#endif // 0
index a0d081a..42f473b 100644 (file)
@@ -45,5 +45,5 @@ struct mempool pool_name = { \
 
 
 #ifdef VALGRIND
-// UNNEEDED void mempool_drop(struct mempool *mp);
+void mempool_drop(struct mempool *mp);
 #endif
index 9a554c1..3c60e55 100644 (file)
@@ -30,7 +30,10 @@ int mkdir_p(const char *path, mode_t mode);
 
 /* mandatory access control(MAC) versions */
 int mkdir_safe_label(const char *path, mode_t mode, uid_t uid, gid_t gid);
-// UNNEEDED int mkdir_parents_label(const char *path, mode_t mode);
+/// UNNEEDED by elogind
+#if 0
+int mkdir_parents_label(const char *path, mode_t mode);
+#endif // 0
 int mkdir_p_label(const char *path, mode_t mode);
 
 /* internally used */
index 9b36bc1..ad30727 100644 (file)
 int fd_is_mount_point(int fd, const char *filename, int flags);
 int path_is_mount_point(const char *path, int flags);
 
-// UNNEEDED int repeat_unmount(const char *path, int flags);
+/// UNNEEDED by elogind
+#if 0
+int repeat_unmount(const char *path, int flags);
 
-// UNNEEDED int umount_recursive(const char *target, int flags);
-// UNNEEDED int bind_remount_recursive(const char *prefix, bool ro);
+int umount_recursive(const char *target, int flags);
+int bind_remount_recursive(const char *prefix, bool ro);
 
-// UNNEEDED int mount_move_root(const char *path);
+int mount_move_root(const char *path);
+#endif // 0
 
 DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent);
 #define _cleanup_endmntent_ _cleanup_(endmntentp)
 
-// UNNEEDED bool fstype_is_network(const char *fstype);
+/// UNNEEDED by elogind
+#if 0
+bool fstype_is_network(const char *fstype);
+#endif // 0
 
 union file_handle_union {
         struct file_handle handle;
index 7dac767..43f2350 100644 (file)
@@ -34,10 +34,14 @@ int parse_mode(const char *s, mode_t *ret);
 int parse_ifindex(const char *s, int *ret);
 
 int parse_size(const char *t, uint64_t base, uint64_t *size);
-// UNNEEDED int parse_range(const char *t, unsigned *lower, unsigned *upper);
 
-// UNNEEDED #define FORMAT_BYTES_MAX 8
-// UNNEEDED char *format_bytes(char *buf, size_t l, uint64_t t);
+/// UNNEEDED by elogind
+#if 0
+int parse_range(const char *t, unsigned *lower, unsigned *upper);
+
+#define FORMAT_BYTES_MAX 8
+char *format_bytes(char *buf, size_t l, uint64_t t);
+#endif // 0
 
 int safe_atou(const char *s, unsigned *ret_u);
 int safe_atoi(const char *s, int *ret_i);
index 3ef8eae..72edda8 100644 (file)
 #endif
 
 bool is_path(const char *p) _pure_;
-// UNNEEDED int path_split_and_make_absolute(const char *p, char ***ret);
+/// UNNEEDED by elogind
+#if 0
+int path_split_and_make_absolute(const char *p, char ***ret);
+#endif // 0
 bool path_is_absolute(const char *p) _pure_;
-// UNNEEDED char* path_make_absolute(const char *p, const char *prefix);
+/// UNNEEDED by elogind
+#if 0
+char* path_make_absolute(const char *p, const char *prefix);
+#endif // 0
 int path_make_absolute_cwd(const char *p, char **ret);
-// UNNEEDED int path_make_relative(const char *from_dir, const char *to_path, char **_r);
+/// UNNEEDED by elogind
+#if 0
+int path_make_relative(const char *from_dir, const char *to_path, char **_r);
+#endif // 0
 char* path_kill_slashes(char *path);
 char* path_startswith(const char *path, const char *prefix) _pure_;
 int path_compare(const char *a, const char *b) _pure_;
 bool path_equal(const char *a, const char *b) _pure_;
 bool path_equal_or_files_same(const char *a, const char *b);
-// UNNEEDED char* path_join(const char *root, const char *path, const char *rest);
+/// UNNEEDED by elogind
+#if 0
+char* path_join(const char *root, const char *path, const char *rest);
 
-// UNNEEDED int path_strv_make_absolute_cwd(char **l);
+int path_strv_make_absolute_cwd(char **l);
+#endif // 0
 char** path_strv_resolve(char **l, const char *prefix);
 char** path_strv_resolve_uniq(char **l, const char *prefix);
 
-// UNNEEDED int find_binary(const char *name, char **filename);
+/// UNNEEDED by elogind
+#if 0
+int find_binary(const char *name, char **filename);
 
-// UNNEEDED bool paths_check_timestamp(const char* const* paths, usec_t *paths_ts_usec, bool update);
+bool paths_check_timestamp(const char* const* paths, usec_t *paths_ts_usec, bool update);
 
-// UNNEEDED int fsck_exists(const char *fstype);
-// UNNEEDED int mkfs_exists(const char *fstype);
+int fsck_exists(const char *fstype);
+int mkfs_exists(const char *fstype);
+#endif // 0
 
 /* Iterates through the path prefixes of the specified path, going up
  * the tree, to root. Also returns "" (and not "/"!) for the root
@@ -69,7 +84,7 @@ char** path_strv_resolve_uniq(char **l, const char *prefix);
 #define PATH_FOREACH_PREFIX_MORE(prefix, path) \
         for (char *_slash = ({ path_kill_slashes(strcpy(prefix, path)); if (streq(prefix, "/")) prefix[0] = 0; strrchr(prefix, 0); }); _slash && ((*_slash = 0), true); _slash = strrchr((prefix), '/'))
 
-// UNNEEDED char *prefix_root(const char *root, const char *path);
+char *prefix_root(const char *root, const char *path);
 
 /* Similar to prefix_root(), but returns an alloca() buffer, or
  * possibly a const pointer into the path parameter */
@@ -96,7 +111,10 @@ char** path_strv_resolve_uniq(char **l, const char *prefix);
                 _ret;                                                   \
         })
 
-// UNNEEDED int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg);
+/// UNNEEDED by elogind
+#if 0
+int parse_path_argument_and_warn(const char *path, bool suppress_root, char **arg);
+#endif // 0
 
 char* dirname_malloc(const char *path);
 
@@ -108,4 +126,7 @@ char *file_in_same_dir(const char *path, const char *filename);
 bool hidden_file_allow_backup(const char *filename);
 bool hidden_file(const char *filename) _pure_;
 
-// UNNEEDED bool is_device_path(const char *path);
+/// UNNEEDED by elogind
+#if 0
+bool is_device_path(const char *path);
+#endif // 0
index e5a7d79..bccecf2 100644 (file)
@@ -25,5 +25,8 @@ int proc_cmdline(char **ret);
 int parse_proc_cmdline(int (*parse_word)(const char *key, const char *value));
 int get_proc_cmdline_key(const char *parameter, char **value);
 
-// UNNEEDED int shall_restore_state(void);
-// UNNEEDED const char* runlevel_to_target(const char *rl);
+/// UNNEEDED by elogind
+#if 0
+int shall_restore_state(void);
+const char* runlevel_to_target(const char *rl);
+#endif // 0
index ba81fc6..8f3a3f2 100644 (file)
@@ -46,13 +46,17 @@ int get_process_state(pid_t pid);
 int get_process_comm(pid_t pid, char **name);
 int get_process_cmdline(pid_t pid, size_t max_length, bool comm_fallback, char **line);
 int get_process_exe(pid_t pid, char **name);
-// UNNEEDED int get_process_uid(pid_t pid, uid_t *uid);
-// UNNEEDED int get_process_gid(pid_t pid, gid_t *gid);
-// UNNEEDED int get_process_capeff(pid_t pid, char **capeff);
-// UNNEEDED int get_process_cwd(pid_t pid, char **cwd);
-// UNNEEDED int get_process_root(pid_t pid, char **root);
-// UNNEEDED int get_process_environ(pid_t pid, char **environ);
-// UNNEEDED int get_process_ppid(pid_t pid, pid_t *ppid);
+
+/// UNNEEDED by elogind
+#if 0
+int get_process_uid(pid_t pid, uid_t *uid);
+int get_process_gid(pid_t pid, gid_t *gid);
+int get_process_capeff(pid_t pid, char **capeff);
+int get_process_cwd(pid_t pid, char **cwd);
+int get_process_root(pid_t pid, char **root);
+int get_process_environ(pid_t pid, char **environ);
+int get_process_ppid(pid_t pid, pid_t *ppid);
+#endif // 0
 
 int wait_for_terminate(pid_t pid, siginfo_t *status);
 int wait_for_terminate_and_warn(const char *name, pid_t pid, bool check_exit_code);
@@ -60,9 +64,13 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid, bool check_exit_cod
 void sigkill_wait(pid_t *pid);
 #define _cleanup_sigkill_wait_ _cleanup_(sigkill_wait)
 
-// UNNEEDED int kill_and_sigcont(pid_t pid, int sig);
+/// UNNEEDED by elogind
+#if 0
+int kill_and_sigcont(pid_t pid, int sig);
+
+void rename_process(const char name[8]);
+#endif // 0
 
-// UNNEEDED void rename_process(const char name[8]);
 int is_kernel_thread(pid_t pid);
 
 int getenv_for_pid(pid_t pid, const char *field, char **_value);
@@ -72,9 +80,12 @@ bool pid_is_unwaited(pid_t pid);
 
 bool is_main_thread(void);
 
-// UNNEEDED noreturn void freeze(void);
+/// UNNEEDED by elogind
+#if 0
+noreturn void freeze(void);
 
-// UNNEEDED bool oom_score_adjust_is_valid(int oa);
+bool oom_score_adjust_is_valid(int oa);
+#endif // 0
 
 #ifndef PERSONALITY_INVALID
 /* personality(7) documents that 0xffffffffUL is used for querying the
@@ -83,17 +94,20 @@ bool is_main_thread(void);
 #define PERSONALITY_INVALID 0xffffffffLU
 #endif
 
-// UNNEEDED unsigned long personality_from_string(const char *p);
-// UNNEEDED const char *personality_to_string(unsigned long);
+/// UNNEEDED by elogind
+#if 0
+unsigned long personality_from_string(const char *p);
+const char *personality_to_string(unsigned long);
 
-// UNNEEDED int ioprio_class_to_string_alloc(int i, char **s);
-// UNNEEDED int ioprio_class_from_string(const char *s);
+int ioprio_class_to_string_alloc(int i, char **s);
+int ioprio_class_from_string(const char *s);
 
-// UNNEEDED const char *sigchld_code_to_string(int i) _const_;
-// UNNEEDED int sigchld_code_from_string(const char *s) _pure_;
+const char *sigchld_code_to_string(int i) _const_;
+int sigchld_code_from_string(const char *s) _pure_;
 
-// UNNEEDED int sched_policy_to_string_alloc(int i, char **s);
-// UNNEEDED int sched_policy_from_string(const char *s);
+int sched_policy_to_string_alloc(int i, char **s);
+int sched_policy_from_string(const char *s);
+#endif // 0
 
 #define PTR_TO_PID(p) ((pid_t) ((uintptr_t) p))
 #define PID_TO_PTR(p) ((void*) ((uintptr_t) p))
index caac8df..6719a7a 100644 (file)
 #include "macro.h"
 
 bool mac_selinux_use(void);
-// UNNEEDED void mac_selinux_retest(void);
+/// UNNEEDED by elogind
+#if 0
+void mac_selinux_retest(void);
+#endif // 0
 
 int mac_selinux_init(const char *prefix);
-// UNNEEDED void mac_selinux_finish(void);
+/// UNNEEDED by elogind
+#if 0
+void mac_selinux_finish(void);
+#endif // 0
 
 int mac_selinux_fix(const char *path, bool ignore_enoent, bool ignore_erofs);
-// UNNEEDED int mac_selinux_apply(const char *path, const char *label);
+/// UNNEEDED by elogind
+#if 0
+int mac_selinux_apply(const char *path, const char *label);
 
-// UNNEEDED int mac_selinux_get_create_label_from_exe(const char *exe, char **label);
-// UNNEEDED int mac_selinux_get_our_label(char **label);
-// UNNEEDED int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label);
-// UNNEEDED void mac_selinux_free(char *label);
+int mac_selinux_get_create_label_from_exe(const char *exe, char **label);
+int mac_selinux_get_our_label(char **label);
+int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label);
+void mac_selinux_free(char *label);
+#endif // 0
 
 int mac_selinux_create_file_prepare(const char *path, mode_t mode);
 void mac_selinux_create_file_clear(void);
+/// UNNEEDED by elogind
+#if 0
+int mac_selinux_create_socket_prepare(const char *label);
+void mac_selinux_create_socket_clear(void);
 
-// UNNEEDED int mac_selinux_create_socket_prepare(const char *label);
-// UNNEEDED void mac_selinux_create_socket_clear(void);
-
-// UNNEEDED int mac_selinux_bind(int fd, const struct sockaddr *addr, socklen_t addrlen);
+int mac_selinux_bind(int fd, const struct sockaddr *addr, socklen_t addrlen);
+#endif // 0
index 32daa05..ae02f4f 100644 (file)
@@ -65,7 +65,10 @@ static inline void *set_remove(Set *s, const void *key) {
 
 /* no set_remove2 */
 /* no set_remove_value */
-// UNNEEDED int set_remove_and_put(Set *s, const void *old_key, const void *new_key);
+/// UNNEEDED by elogind
+#if 0
+int set_remove_and_put(Set *s, const void *old_key, const void *new_key);
+#endif // 0
 /* no set_remove_and_replace */
 int set_merge(Set *s, Set *other);
 
@@ -124,7 +127,10 @@ static inline char **set_get_strv(Set *s) {
 
 int set_consume(Set *s, void *value);
 int set_put_strdup(Set *s, const char *p);
-// UNNEEDED int set_put_strdupv(Set *s, char **l);
+/// UNNEEDED by elogind
+#if 0
+int set_put_strdupv(Set *s, char **l);
+#endif // 0
 
 #define SET_FOREACH(e, s, i) \
         for ((i) = ITERATOR_FIRST; set_iterate((s), &(i), (void**)&(e)); )
index 5926125..b746e5c 100644 (file)
@@ -29,8 +29,11 @@ int reset_all_signal_handlers(void);
 int reset_signal_mask(void);
 
 int ignore_signals(int sig, ...);
-// UNNEEDED int default_signals(int sig, ...);
-// UNNEEDED int sigaction_many(const struct sigaction *sa, ...);
+/// UNNEEDED by elogind
+#if 0
+int default_signals(int sig, ...);
+int sigaction_many(const struct sigaction *sa, ...);
+#endif // 0
 
 int sigset_add_many(sigset_t *ss, ...);
 int sigprocmask_many(int how, sigset_t *old, ...);
@@ -39,5 +42,7 @@ const char *signal_to_string(int i) _const_;
 int signal_from_string(const char *s) _pure_;
 
 int signal_from_string_try_harder(const char *s);
-
-// UNNEEDED void nop_signal_handler(int sig);
+/// UNNEEDED by elogind
+#if 0
+void nop_signal_handler(int sig);
+#endif // 0
index 327a078..c7a4eb3 100644 (file)
@@ -48,11 +48,14 @@ bool mac_smack_use(void);
 
 int mac_smack_fix(const char *path, bool ignore_enoent, bool ignore_erofs);
 
-// UNNEEDED const char* smack_attr_to_string(SmackAttr i) _const_;
-// UNNEEDED SmackAttr smack_attr_from_string(const char *s) _pure_;
-// UNNEEDED int mac_smack_read(const char *path, SmackAttr attr, char **label);
-// UNNEEDED int mac_smack_read_fd(int fd, SmackAttr attr, char **label);
-// UNNEEDED int mac_smack_apply(const char *path, SmackAttr attr, const char *label);
-// UNNEEDED int mac_smack_apply_fd(int fd, SmackAttr attr, const char *label);
-// UNNEEDED int mac_smack_apply_pid(pid_t pid, const char *label);
-// UNNEEDED int mac_smack_copy(const char *dest, const char *src);
+/// UNNEEDED by elogind
+#if 0
+const char* smack_attr_to_string(SmackAttr i) _const_;
+SmackAttr smack_attr_from_string(const char *s) _pure_;
+int mac_smack_read(const char *path, SmackAttr attr, char **label);
+int mac_smack_read_fd(int fd, SmackAttr attr, char **label);
+int mac_smack_apply(const char *path, SmackAttr attr, const char *label);
+int mac_smack_apply_fd(int fd, SmackAttr attr, const char *label);
+int mac_smack_apply_pid(pid_t pid, const char *label);
+int mac_smack_copy(const char *dest, const char *src);
+#endif // 0
index 4c99054..2924c30 100644 (file)
@@ -66,19 +66,16 @@ typedef enum SocketAddressBindIPv6Only {
 } SocketAddressBindIPv6Only;
 
 #define socket_address_family(a) ((a)->sockaddr.sa.sa_family)
-#endif // 0
 
-// UNNEEDED int socket_address_parse(SocketAddress *a, const char *s);
-// UNNEEDED int socket_address_parse_and_warn(SocketAddress *a, const char *s);
-// UNNEEDED int socket_address_parse_netlink(SocketAddress *a, const char *s);
-// UNNEEDED int socket_address_print(const SocketAddress *a, char **p);
-// UNNEEDED int socket_address_verify(const SocketAddress *a) _pure_;
-// UNNEEDED int socket_address_unlink(SocketAddress *a);
+int socket_address_parse(SocketAddress *a, const char *s);
+int socket_address_parse_and_warn(SocketAddress *a, const char *s);
+int socket_address_parse_netlink(SocketAddress *a, const char *s);
+int socket_address_print(const SocketAddress *a, char **p);
+int socket_address_verify(const SocketAddress *a) _pure_;
+int socket_address_unlink(SocketAddress *a);
 
-// UNNEEDED bool socket_address_can_accept(const SocketAddress *a) _pure_;
+bool socket_address_can_accept(const SocketAddress *a) _pure_;
 
-/// UNNEEDED by elogind
-#if 0
 int socket_address_listen(
                 const SocketAddress *a,
                 int flags,
@@ -92,47 +89,55 @@ int socket_address_listen(
                 mode_t socket_mode,
                 const char *label);
 int make_socket_fd(int log_level, const char* address, int flags);
-#endif // 0
 
-// UNNEEDED bool socket_address_is(const SocketAddress *a, const char *s, int type);
-// UNNEEDED bool socket_address_is_netlink(const SocketAddress *a, const char *s);
+bool socket_address_is(const SocketAddress *a, const char *s, int type);
+bool socket_address_is_netlink(const SocketAddress *a, const char *s);
 
-// UNNEEDED bool socket_address_matches_fd(const SocketAddress *a, int fd);
+bool socket_address_matches_fd(const SocketAddress *a, int fd);
 
-// UNNEEDED bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
+bool socket_address_equal(const SocketAddress *a, const SocketAddress *b) _pure_;
 
-// UNNEEDED const char* socket_address_get_path(const SocketAddress *a);
+const char* socket_address_get_path(const SocketAddress *a);
+#endif // 0
 
 bool socket_ipv6_is_supported(void);
 
-// UNNEEDED int sockaddr_port(const struct sockaddr *_sa) _pure_;
+/// UNNEEDED by elogind
+#if 0
+int sockaddr_port(const struct sockaddr *_sa) _pure_;
 
-// UNNEEDED Sint sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
-// UNNEEDED int getpeername_pretty(int fd, char **ret);
-// UNNEEDED int getsockname_pretty(int fd, char **ret);
+Sint sockaddr_pretty(const struct sockaddr *_sa, socklen_t salen, bool translate_ipv6, bool include_port, char **ret);
+int getpeername_pretty(int fd, char **ret);
+int getsockname_pretty(int fd, char **ret);
 
-// UNNEEDED int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret);
-// UNNEEDED int getnameinfo_pretty(int fd, char **ret);
+int socknameinfo_pretty(union sockaddr_union *sa, socklen_t salen, char **_ret);
+int getnameinfo_pretty(int fd, char **ret);
 
-// UNNEEDED const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
-// UNNEEDED SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
+const char* socket_address_bind_ipv6_only_to_string(SocketAddressBindIPv6Only b) _const_;
+SocketAddressBindIPv6Only socket_address_bind_ipv6_only_from_string(const char *s) _pure_;
 
-// UNNEEDED int netlink_family_to_string_alloc(int b, char **s);
-// UNNEEDED int netlink_family_from_string(const char *s) _pure_;
+int netlink_family_to_string_alloc(int b, char **s);
+int netlink_family_from_string(const char *s) _pure_;
 
-// UNNEEDED bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b);
+bool sockaddr_equal(const union sockaddr_union *a, const union sockaddr_union *b);
+#endif // 0
 
 int fd_inc_sndbuf(int fd, size_t n);
 int fd_inc_rcvbuf(int fd, size_t n);
-
-// UNNEEDED int ip_tos_to_string_alloc(int i, char **s);
-// UNNEEDED int ip_tos_from_string(const char *s);
+/// UNNEEDED by elogind
+#if 0
+int ip_tos_to_string_alloc(int i, char **s);
+int ip_tos_from_string(const char *s);
+#endif // 0
 
 int getpeercred(int fd, struct ucred *ucred);
 int getpeersec(int fd, char **ret);
 
 int send_one_fd(int transport_fd, int fd, int flags);
-// UNNEEDED int receive_one_fd(int transport_fd, int flags);
+/// UNNEEDED by elogind
+#if 0
+int receive_one_fd(int transport_fd, int flags);
+#endif // 0
 
 #define CMSG_FOREACH(cmsg, mh)                                          \
         for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))