必须使用共享库编写一个程序,显示所有已记录用户的列表(如果使用-i或-g,则为其ID和组)。共享库中的函数正常工作,但似乎函数指针导致分段错误。因为它是学校的一个分配,我必须使用C,函数必须不返回任何内容,只取用户名。我很熟悉linux中的编程(显然)。
主要代码:
#include <unistd.h>
#include <stdlib.h>
#include <utmp.h>
#include <dlfcn.h>
struct utmp *p;
int main(int argc, char* argv[]){
int opt, iflag = 0;
int gflag = 0;
void *handle;
while((opt = getopt(argc, argv, "ig")) != -1)
{
switch(opt)
{
case 'i':
iflag = 1;
break;
case 'g':
gflag = 1;
break;
default:
fprintf(stderr, "Błąd \n");
exit(EXIT_FAILURE);
}
}
handle = dlopen("./zad2lib.so", RTLD_LAZY);
if (handle == NULL) {
fprintf(stderr, "Unable to open library: %s\n", dlerror());
iflag = 0;
gflag = 0;
}
while ((p = getutent()) != NULL) {
if (p->ut_type == USER_PROCESS)
{
if (iflag == 1) {
dlerror();
void (*func)(char*) = (void(*)())dlsym(handle, "userID");
func(p->ut_user);
}
printf("%s ", p->ut_user);
if (gflag == 1) {
dlerror();
void (*func)(char*) = (void(*)())dlsym(handle, "userGroups");
func(p->ut_user);
}
}
printf("\n");
}
dlclose(handle);
}
return 0;
}
.so文件:
#include <sys/types.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
void userID(char *name) {
struct passwd *pw = getpwnam(name);
printf("%d ", pw->pw_uid);
}
void userGroups(char *name) {
struct passwd *pw = getpwnam(name);
int i;
int gidsize = 100;
struct group* g;
gid_t *grouplist = malloc(gidsize*sizeof(gid_t));
getgrouplist(name, pw->pw_gid, grouplist, &gidsize);
printf("[");
for (i = 0; i < gidsize; i++) {
g = getgrgid(grouplist[i]);
printf(" %s", g->gr_name);
}
printf(" ]");
free(grouplist);
}