1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <string.h>
17 #include <unistd.h>
18 
19 #include "hnp_base.h"
20 #include "hnp_pack.h"
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 extern int HnpCliShowHelp(int argc, char *argv[]);
27 
28 typedef int (*HNP_CMD_PROCESS_FUNC)(int argc, char *argv[]);
29 
30 typedef struct NativeManagerCmdInfoStru {
31     char *cmd;
32     HNP_CMD_PROCESS_FUNC process;
33 } NativeManagerCmdInfo;
34 
35 NativeManagerCmdInfo g_nativeManagerCmd[] = {
36     {"help", HnpCliShowHelp},
37     {"-h", HnpCliShowHelp},
38     {"pack", HnpCmdPack}
39 };
40 
HnpCliShowHelp(int argc,char * argv[])41 int HnpCliShowHelp(int argc, char *argv[])
42 {
43     (void)argc;
44     (void)argv;
45 
46     HNP_LOGI("\r\nusage:hnpcli <command> <args> [-i <software package dir>][-o <hnp output path>]"
47         "[-n <native package name>][-v <native package version>]\r\n"
48         "\r\nThese are common hnpcli commands used in various situations:\r\n"
49         "\r\npack:    packet native software package to .hnp file"
50         "\r\n         hnpcli pack <-i [source path]> <-o [dst path]> <-n [software name]> <-v [software version]>"
51         "\r\n         -i    : [required]    input path of software package dir"
52         "\r\n         -o    : [optional]    output path of hnp file. if not set then ouput to current directory"
53         "\r\n         -n    : [optional]    software name. if not hnp.json in input dir then must set"
54         "\r\n         -v    : [optional]    software version. if not hnp.json in input dir then must set\r\n"
55         "\r\nfor example:\r\n"
56         "\r\n    hnpcli pack -i /usr1/native_sample -o /usr1/output -n native_sample -v 1.1\r\n");
57 
58     return 0;
59 }
60 
HnpCmdCheck(const char * cmd)61 static NativeManagerCmdInfo* HnpCmdCheck(const char *cmd)
62 {
63     int i;
64     int cmdNum = sizeof(g_nativeManagerCmd) / sizeof(NativeManagerCmdInfo);
65 
66     for (i = 0; i < cmdNum; i++) {
67         if (!strcmp(cmd, g_nativeManagerCmd[i].cmd)) {
68             return &g_nativeManagerCmd[i];
69         }
70     }
71     return NULL;
72 }
73 
main(int argc,char * argv[])74 int main(int argc, char *argv[])
75 {
76     int ret;
77     NativeManagerCmdInfo *cmdInfo = NULL;
78 
79     if (argc < HNP_INDEX_2) {
80         HnpCliShowHelp(argc, argv);
81         return HNP_ERRNO_OPERATOR_ARGV_MISS;
82     }
83 
84     HNP_LOGI("native manager process start.");
85 
86     /* 检验用户命令,获取对应的处理函数 */
87     cmdInfo = HnpCmdCheck(argv[HNP_INDEX_1]);
88     if (cmdInfo == NULL) {
89         HNP_LOGE("invalid cmd!. cmd:%{public}s", argv[HNP_INDEX_1]);
90         return HNP_ERRNO_OPERATOR_TYPE_INVALID;
91     }
92 
93     /* 执行命令 */
94     ret = cmdInfo->process(argc, argv);
95     if (ret == HNP_ERRNO_OPERATOR_ARGV_MISS) {
96         HnpCliShowHelp(argc, argv);
97     }
98 
99     HNP_LOGI("native manager process exit. ret=%{public}d ", ret);
100     return ret;
101 }
102 
103 #ifdef __cplusplus
104 }
105 #endif