Skip to content
Advertisement

Segmentation fault (core dumped) C linux

So i have to make a program that execution results are similar to those after using command who and who am i in linux. the problem is that both functions inside if(strcmp… and in else… are working when separated.

The main issue is that i have to have them both in one file, and it just not work. When put together only that do something ./program am i, and ./program tells Segmentation fault (core dumped).

Second issue is that i have no clue how to make part ./program am i work properly it should return me only me: User pts/0 date time… not all of users like in else… part.

#include    <stdio.h>
#include    <utmp.h>
#include    <fcntl.h>
#include    <unistd.h>
#include    <stdlib.h>
#include    <time.h>
#include    <string.h>
#include    <sys/types.h>

#define SHOWHOST

void show_info_who( struct utmp *utbufp )
{
    if(utbufp->ut_type > 4){
        time_t czas = utbufp->ut_time;
        char buf[80];
        struct tm* timeinfo = localtime(&czas);

        printf("%-8.8s", utbufp->ut_name);  
        printf(" ");                
        printf("%-8.8s", utbufp->ut_line);  
        printf(" ");                
        strftime(buf, 80, "%F %R" , timeinfo);
        printf("%s", buf);
        printf(" ");                


    #ifdef  SHOWHOST
        printf("(%s)", utbufp->ut_host);    
    #endif
        printf("n");               
    }
}


int main(int argc, char *argv[])
{
    struct utmp current_record;
    int     utmpfd;     
    int     reclen = sizeof(current_record);

    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
        perror( UTMP_FILE );
        exit(1);
    }

    if(strcmp ( argv[1], "am") == 0){
        if(strcmp ( argv[2], "i") == 0){
            while ( read(utmpfd, &current_record, reclen) == reclen )
                show_info_who(&current_record);
                printf("testn");
        }

    close(utmpfd);
    return 0;
    }

        while ( read(utmpfd, &current_record, reclen) == reclen )
            show_info_who(&current_record);
        close(utmpfd);

        return 0;


}

Advertisement

Answer

Why don’t you try using,

void setutent(void); // for rewinding
struct utmp *getutent(void);

Directly openning and seeking utmp file is not recommended. An utmp file seems to be a normal file that can freely access, but it behaves like a database.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement