summaryrefslogtreecommitdiff
path: root/components/lwp/lwp_args.h
blob: fa6064d852bf44caa5277bf6171a61738b76346e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * Copyright (c) 2006-2025 RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-01-12     Shell        separate argv, envp, aux processing from execve(2).
 *                             Bugs fix for script arguments processing.
 */
#ifndef __LWP_ARGV_H__
#define __LWP_ARGV_H__

#include <rtthread.h>

struct rt_lwp;

/**
 * @brief Type of arguments
 */
enum lwp_args_type {
    LWP_ARGS_TYPE_ARG,      /**< User-space arguments */
    LWP_ARGS_TYPE_KARG,     /**< Kernel-space arguments */
    LWP_ARGS_TYPE_ENVP,     /**< User-space environment variables */
    LWP_ARGS_TYPE_KENVP,    /**< Kernel-space environment variables */
    LWP_ARGS_TYPE_NULLPTR   /**< NULL pointer terminator */
};

/**
 * @brief String vector structure
 */
struct lwp_string_vector
{
    const char **strvec;         /**< Pointer to array of strings */
    rt_uint32_t strvec_buflen;   /**< Total buffer length of strvec */
    rt_uint32_t string_count;    /**< Number of strings in strvec */
};

/**
 * @brief Arguments information structure
 *
 * @note str_buf stores all argument strings' content.
 *       argv stores argument strings' pointers in str_buf.
 *       envp stores environment variable strings' pointers in str_buf.
 */
struct lwp_args_info
{
    int argv0_strlen;                  /**< Length of argv[0] */
    int strings_length;                /**< Total length of all argument strings */
    int str_buf_size;                  /**< Total size of str_buf */

    char *str_buf;                     /**< Buffer to store all argument strings */
    struct lwp_string_vector argv;     /**< Vector of argument strings */
    struct lwp_string_vector envp;     /**< Vector of environment variable strings */
};

rt_err_t lwp_args_init(struct lwp_args_info *ai);
void lwp_args_detach(struct lwp_args_info *ai);
struct process_aux *lwp_argscopy(struct rt_lwp *lwp, struct lwp_args_info *args_info);;
rt_err_t lwp_args_put(struct lwp_args_info *args, const char **strv_addr, enum lwp_args_type atype);
rt_err_t lwp_args_put_argv(struct lwp_args_info *args, const char **argv_uaddr);
rt_err_t lwp_args_put_envp(struct lwp_args_info *args, const char **envp_uaddr);
rt_err_t lwp_args_load_script(struct lwp_args_info *args, const char *filename);
const char *lwp_args_get_argv_0(struct lwp_args_info *ai);
char** lwp_get_envp(struct rt_lwp *lwp, rt_size_t *penvp_counts);
void lwp_print_envp(struct rt_lwp *lwp);

char** lwp_get_command_line_args(struct rt_lwp *lwp);
void lwp_free_command_line_args(char** argv);

#endif /* __LWP_ARGV_H__ */