ex29
This commit is contained in:
parent
d8c63c261d
commit
1fdab16d96
@ -1,14 +1,18 @@
|
||||
SHELL=/bin/bash
|
||||
CFLAGS=-Wall -g -DNDEBUG
|
||||
SHELL = /bin/bash
|
||||
CFLAGS = -Wall -g -DNDEBUG -fPIC
|
||||
LDLIBS = -ldl
|
||||
|
||||
EXERCISES := $(shell ./list-exercises)
|
||||
|
||||
all: $(EXERCISES)
|
||||
all: $(EXERCISES) libex29.so
|
||||
|
||||
ex19: object.o
|
||||
|
||||
ex22_main: ex22.o
|
||||
|
||||
libex29.so: libex29.o
|
||||
$(CC) -shared -o $@ $<
|
||||
|
||||
clean:
|
||||
shopt -s nullglob ; \
|
||||
$(RM) $(EXERCISES) *.o *.a
|
||||
|
33
lcthw-remnants-2/ex29.c
Normal file
33
lcthw-remnants-2/ex29.c
Normal file
@ -0,0 +1,33 @@
|
||||
#include <stdio.h>
|
||||
#include "dbg.h"
|
||||
#include <dlfcn.h>
|
||||
|
||||
typedef int (*lib_function)(const char *data);
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int rc = 0;
|
||||
check(argc == 4, "USAGE: ex29 libex29.so function data");
|
||||
|
||||
char *lib_file = argv[1];
|
||||
char *func_to_run = argv[2];
|
||||
char *data = argv[3];
|
||||
|
||||
void *lib = dlopen(lib_file, RTLD_NOW);
|
||||
check(lib != NULL, "Failed to open the library %s: %s", lib_file, dlerror());
|
||||
|
||||
lib_function func = dlsym(lib, func_to_run);
|
||||
check(func != NULL, "Did not find %s function in the library %s: %s", func_to_run, lib_file, dlerror());
|
||||
|
||||
rc = func(data);
|
||||
check(rc == 0, "Function %s return %d for data: %s", func_to_run, rc, data);
|
||||
|
||||
rc = dlclose(lib);
|
||||
check(rc == 0, "Failed to close %s", lib_file);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
return 1;
|
||||
}
|
45
lcthw-remnants-2/libex29.c
Normal file
45
lcthw-remnants-2/libex29.c
Normal file
@ -0,0 +1,45 @@
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "dbg.h"
|
||||
|
||||
|
||||
int print_a_message(const char *msg)
|
||||
{
|
||||
printf("A STRING: %s\n", msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int uppercase(const char *msg)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
// BUG: \0 termination problems
|
||||
for(i = 0; msg[i] != '\0'; i++) {
|
||||
printf("%c", toupper(msg[i]));
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lowercase(const char *msg)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
// BUG: \0 termination problems
|
||||
for(i = 0; msg[i] != '\0'; i++) {
|
||||
printf("%c", tolower(msg[i]));
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fail_on_purpose(const char *msg)
|
||||
{
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user