1 /*
2  * Copyright (c) 2006-2024, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2024-01-12     Shell        separate argv, envp, aux processing from execve(2).
9  *                             Bugs fix for script arguments processing.
10  */
11 #ifndef __LWP_ARGV_H__
12 #define __LWP_ARGV_H__
13 
14 #include <rtthread.h>
15 
16 struct rt_lwp;
17 
18 enum lwp_args_type {
19     LWP_ARGS_TYPE_ARG,
20     LWP_ARGS_TYPE_KARG,
21     LWP_ARGS_TYPE_ENVP,
22     LWP_ARGS_TYPE_KENVP,
23     LWP_ARGS_TYPE_NULLPTR
24 };
25 
26 struct lwp_string_vector
27 {
28     const char **strvec;
29     rt_uint32_t strvec_buflen;
30     rt_uint32_t string_count;
31 };
32 
33 struct lwp_args_info
34 {
35     int argv0_strlen;
36     int strings_length;
37     int str_buf_size;
38 
39     char *str_buf;
40     struct lwp_string_vector argv;
41     struct lwp_string_vector envp;
42 };
43 
44 rt_err_t lwp_args_init(struct lwp_args_info *ai);
45 void lwp_args_detach(struct lwp_args_info *ai);
46 struct process_aux *lwp_argscopy(struct rt_lwp *lwp, struct lwp_args_info *args_info);;
47 rt_err_t lwp_args_put(struct lwp_args_info *args, const char **strv_addr, enum lwp_args_type atype);
48 rt_err_t lwp_args_put_argv(struct lwp_args_info *args, const char **argv_uaddr);
49 rt_err_t lwp_args_put_envp(struct lwp_args_info *args, const char **envp_uaddr);
50 rt_err_t lwp_args_load_script(struct lwp_args_info *args, const char *filename);
51 const char *lwp_args_get_argv_0(struct lwp_args_info *ai);
52 char** lwp_get_envp(struct rt_lwp *lwp, rt_size_t *penvp_counts);
53 void lwp_print_envp(struct rt_lwp *lwp);
54 
55 char** lwp_get_command_line_args(struct rt_lwp *lwp);
56 void lwp_free_command_line_args(char** argv);
57 
58 #endif /* __LWP_ARGV_H__ */
59