sp_env.c 6.3 KB

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