xref: /aosp_15_r20/external/grpc-grpc/src/ruby/ext/grpc/rb_loader.c (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include "rb_grpc_imports.generated.h"
20 
21 #if GPR_WINDOWS
22 #include <tchar.h>
23 
grpc_rb_load_core()24 int grpc_rb_load_core() {
25 #if GPR_ARCH_64
26 #if GRPC_RUBY_WINDOWS_UCRT
27   TCHAR fname[] = _T("grpc_c.64-ucrt.ruby");
28 #else
29   TCHAR fname[] = _T("grpc_c.64-msvcrt.ruby");
30 #endif
31 #else
32   TCHAR fname[] = _T("grpc_c.32-msvcrt.ruby");
33 #endif
34   HMODULE module = GetModuleHandle(_T("grpc_c.so"));
35   TCHAR path[2048 + 32] = _T("");
36   LPTSTR seek_back = NULL;
37   GetModuleFileName(module, path, 2048);
38 
39   seek_back = _tcsrchr(path, _T('\\'));
40 
41   while (seek_back) {
42     HMODULE grpc_c;
43     _tcscpy(seek_back + 1, fname);
44     grpc_c = LoadLibrary(path);
45     if (grpc_c) {
46       grpc_rb_load_imports(grpc_c);
47       return 1;
48     } else {
49       *seek_back = _T('\0');
50       seek_back = _tcsrchr(path, _T('\\'));
51     }
52   }
53 
54   return 0;
55 }
56 
57 #else
58 
grpc_rb_load_core()59 int grpc_rb_load_core() { return 1; }
60 
61 #endif
62