Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.44 KB | None | 0 0
  1. #include <dlfcn.h>
  2. #include <sys/stat.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <dirent.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. struct Parametrs {
  11.     int arg[16];
  12. };
  13.  
  14. int main(int argc, char *argv[]) {
  15.     struct Parametrs st;
  16.     const char *types = argv[3];
  17.     int arg = 4, counter = 0;
  18.     void *handle = dlopen(argv[1], RTLD_NOW);
  19.     if (!handle) {
  20.         exit(1);
  21.     }
  22.     void *func = dlsym(handle, argv[2]);
  23.     if (!func) {
  24.         exit(1);    
  25.     }
  26.     for (const char *p = types + 1; *p; ++p) {
  27.         if (*p == 'd') {
  28.             counter += 1;
  29.             double val = strtod(argv[arg],NULL);
  30.             memcpy(&st.arg[counter], &val, sizeof(val));
  31.         } else if (*p == 's') {
  32.             st.arg[counter] = (int) argv[arg];
  33.         } else if (*p == 'i') {
  34.             int val = atoi(argv[arg]);
  35.             st.arg[counter] = val;
  36.         }
  37.         ++counter; ++arg;  
  38.     }
  39.     if (types[0] == 'd') {
  40.         double result = (*(double (*)(struct Parametrs)) func)(st);
  41.         printf("%.10g\n", result);
  42.     } else if (types[0] == 's') {
  43.         char *result = (*(char * (*)(struct Parametrs)) func)(st);
  44.         printf("%s\n", result);
  45.     } else if (types[0] == 'i') {
  46.         int result = (*(int (*)(struct Parametrs)) func)(st);
  47.         printf("%d\n", result);
  48.     } else {
  49.         (*(void (*)(struct Parametrs)) func)(st);
  50.     }
  51.     dlclose(handle);
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement