sp_env.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include <winpr/sysinfo.h>
  2. #include <winpr/thread.h>
  3. #include "precompile.h"
  4. #include "sp_env.h"
  5. #include "sp_def.h"
  6. #include "sp_iom.h"
  7. #include "shm_mem.h"
  8. #include "sp_logwithlinkforc.h"
  9. #include "fileutil.h"
  10. #include "toolkit.h"
  11. #include <winpr/string.h>
  12. #include <winpr/environment.h>
  13. void set_ld_library_path(sp_env_t* env)
  14. {
  15. #if defined(_MSC_VER)
  16. const char* name = "PATH";
  17. #else
  18. const char* name = "LD_LIBRARY_PATH";
  19. #endif //_MSC_VER
  20. const char* RVC_DEP_PATH = "RVC_VENDOR_HOME";
  21. int result;
  22. char ld_value[1025] = {'\0'};
  23. char dep_value[1025] = { '\0' };
  24. char new_ld_value[1025] = { '\0' };
  25. char manu[16] = { '\0' };
  26. char* pos;
  27. size_t i = 0;
  28. size_t size = 1024;
  29. if (env->cfg->root_ini != NULL && env->cfg->root_ini->manufacturer != NULL)
  30. {
  31. strcpy(manu, env->cfg->root_ini->manufacturer);
  32. if (strlen(manu) == 0) {
  33. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "not any config for manufacturer, cannot set sub dep directory!");
  34. return;
  35. }
  36. }
  37. for (i = 0; i < strlen(manu); ++i) {
  38. if (!isalpha(manu[i])) {
  39. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "not pure alpha: %s", manu);
  40. return;
  41. }
  42. if ('A' <= manu[i] && manu[i] <= 'Z')
  43. manu[i] = manu[i] + 32;
  44. }
  45. strcpy(dep_value, env->dir->dep_path);
  46. strcat(dep_value, SPLIT_SLASH_STR);
  47. strcat(dep_value, manu);
  48. result = toolkit_getenv(name, ld_value, &size);
  49. if (result != 0) {
  50. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "getenv %s failed: %s", name, toolkit_strerror(result));
  51. if (result == TOOLKIT_ENOENT) {
  52. strcpy(new_ld_value, env->dir->bin_path);
  53. strcat(new_ld_value, ENV_SEP_STR);
  54. strcat(new_ld_value, env->dir->dep_path);
  55. strcat(new_ld_value, ENV_SEP_STR);
  56. strcat(new_ld_value, dep_value);
  57. toolkit_setenv(name, new_ld_value);
  58. }
  59. return;
  60. }
  61. if (strstr(ld_value, dep_value) != NULL) {
  62. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "has been set vendor, ld path:%s, dep_value:%s, manu:%s",
  63. (ld_value == NULL ? "" : ld_value), (dep_value == NULL ? "" : dep_value), manu);
  64. return;
  65. }
  66. size = 1024;
  67. memset(dep_value, '\0', sizeof(dep_value));
  68. result = toolkit_getenv(RVC_DEP_PATH, dep_value, &size);
  69. if (result != 0 && result != TOOLKIT_ENOENT) {
  70. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "getenv %s failed: %s", RVC_DEP_PATH, toolkit_strerror(result));
  71. return;
  72. }
  73. //remove old vendor path
  74. if (result == 0 && (pos = strstr(ld_value, dep_value)) != NULL) {
  75. if (pos > ld_value && --pos && pos[0] == ENV_SEP_CHAR) {
  76. pos[0] = '\0';
  77. strcpy(new_ld_value, ld_value);
  78. pos[0] = ENV_SEP_CHAR, pos++;
  79. strcat(new_ld_value, pos + strlen(dep_value));
  80. }
  81. else if(pos == ld_value) {
  82. strcpy(new_ld_value, pos + strlen(dep_value));
  83. }
  84. } else {
  85. strcpy(new_ld_value, ld_value);
  86. }
  87. strcpy(dep_value, env->dir->dep_path);
  88. strcat(dep_value, SPLIT_SLASH_STR);
  89. strcat(dep_value, manu);
  90. if(new_ld_value[strlen(new_ld_value)-1] != ENV_SEP_CHAR)
  91. strcat(new_ld_value, ENV_SEP_STR);
  92. strcat(new_ld_value, dep_value);
  93. result = toolkit_setenv(RVC_DEP_PATH, dep_value);
  94. if (result != 0) {
  95. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "setenv failed: %s", toolkit_strerror(result));
  96. }
  97. result = toolkit_setenv(name, new_ld_value);
  98. if (result != 0) {
  99. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "setenv failed: %s", toolkit_strerror(result));
  100. }
  101. }
  102. void sp_set_env(sp_env_t *env)
  103. {
  104. shm_set_user_data(0, env);
  105. }
  106. int load_mod_mgr(sp_mod_mgr_t *mod_mgr, sp_cfg_t *cfg)
  107. {
  108. int i;
  109. for (i = 0; i < cfg->shell_ini->arr_module->nelts; ++i) {
  110. sp_cfg_shell_module_t *cfg_mod = ARRAY_IDX(cfg->shell_ini->arr_module, i, sp_cfg_shell_module_t*);
  111. int rc = sp_mod_mgr_add_module(mod_mgr, cfg_mod);
  112. if (rc != 0) {
  113. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "load_mod->add_module() failed, %s", cfg_mod->name);
  114. return rc;
  115. }
  116. }
  117. for (i = 0; i < cfg->shell_ini->arr_entity->nelts; ++i) {
  118. sp_cfg_shell_entity_t *cfg_ent = ARRAY_IDX(cfg->shell_ini->arr_entity, i, sp_cfg_shell_entity_t*);
  119. int rc = sp_mod_mgr_add_entity(mod_mgr, cfg_ent);
  120. if (rc != 0) {
  121. DbgWithLinkForC(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM, "load_mod->add_entity() failed, %s", cfg_ent->name);
  122. return rc;
  123. }
  124. }
  125. return 0;
  126. }
  127. static int unload_mod_mgr(sp_mod_mgr_t *mod_mgr, sp_cfg_t *cfg)
  128. {
  129. int i;
  130. for (i = 0; i < cfg->shell_ini->arr_entity->nelts; ++i) {
  131. sp_cfg_shell_entity_t *cfg_ent = ARRAY_IDX(cfg->shell_ini->arr_entity, i, sp_cfg_shell_entity_t*);
  132. int rc = sp_mod_mgr_remove_entity(mod_mgr, cfg_ent->name);
  133. if (rc != 0)
  134. return rc;
  135. }
  136. for (i = 0; i < cfg->shell_ini->arr_module->nelts; ++i) {
  137. sp_cfg_shell_module_t *cfg_mod = ARRAY_IDX(cfg->shell_ini->arr_module, i, sp_cfg_shell_module_t*);
  138. int rc = sp_mod_mgr_remove_module(mod_mgr, cfg_mod->name);
  139. if (rc != 0)
  140. return rc;
  141. }
  142. return 0;
  143. }
  144. static __inline const char *new_url(char *buf, int tcp_type)
  145. {
  146. // just implement tcp sockef first. [3/25/2020 19:07 Gifur]
  147. if (tcp_type) {
  148. sprintf(buf, "tcp://%s:%d", "127.0.0.1", 3232);
  149. }
  150. else {
  151. sprintf(buf, "pipe://spshell.1.%08x", GetTickCount() * GetCurrentProcessId() % 0xffff);
  152. }
  153. return buf;
  154. }
  155. int sp_env_create(void *hint_addr, int range, const sp_cfg_start_args_t* args, sp_env_t **p_env, int* err)
  156. {
  157. sp_env_t *env;
  158. int rc = Error_Unexpect;
  159. char url[96];
  160. char szPath[MAX_PATH] = { 0 };
  161. sp_version_t *ver;
  162. if (err != NULL) *err = 0;
  163. env = shm_malloc(sizeof(sp_env_t));
  164. memset(env, 0, sizeof(sp_env_t));
  165. sp_set_env(env);
  166. /** no used for now [Gifur@20201125]*/
  167. //env->shm_addr = hint_addr;
  168. env->shm_range = range;
  169. env->url = shm_strdup(new_url(url, args->ipc_type));
  170. rc = sp_dir_create(&env->dir);
  171. if (rc != 0) {
  172. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "create dir object failed!");
  173. return rc;
  174. }
  175. rc = sp_cfg_create(env->dir, args, &env->cfg);
  176. if (rc != 0) {
  177. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "create cfg object failed!");
  178. return rc;
  179. }
  180. if (err != NULL && env->cfg->root_ini->terminal_no == NULL) *err = 1;
  181. rc = sp_mod_mgr_create(&env->mod_mgr);
  182. if (rc != 0) {
  183. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "create mod mgr failed!");
  184. return rc;
  185. }
  186. rc = load_mod_mgr(env->mod_mgr, env->cfg);
  187. if (rc != 0)
  188. return rc;
  189. sprintf_s(szPath, sizeof(szPath), "%s" SPLIT_SLASH_STR "BootLog", env->dir->root_runinfo_path);
  190. ver = &env->cfg->install_ini->install_version;
  191. rc = sp_btr_write_on_start(szPath, ver, &env->btr_ctx);
  192. if (rc != 0) {
  193. DbgWithLinkForC(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM, "write boot log failed!");
  194. }
  195. set_ld_library_path(env);
  196. *p_env = env;
  197. rc = 0;
  198. return rc;
  199. }
  200. void sp_env_destroy(sp_env_t *env)
  201. {
  202. unload_mod_mgr(env->mod_mgr, env->cfg);
  203. sp_mod_mgr_destroy(env->mod_mgr);
  204. sp_cfg_destroy(env->cfg);
  205. sp_dir_destroy(env->dir);
  206. shm_free(env->url);
  207. shm_free(env->btr_ctx);
  208. shm_free(env);
  209. }
  210. int sp_env_new_id(sp_env_t *env)
  211. {
  212. return (int)InterlockedIncrement((LONG*)&env->seq_id);
  213. }
  214. sp_env_t *sp_get_env()
  215. {
  216. return shm_get_user_data(0);
  217. }