Skip to content
Advertisement

My own program who work as “which” command in linux – dont work great

I would like to make my own program who will be work as which command in linux. Original which command works that (example for pwd):

$ which pwd

/bin/pwd

but my program works that:

$ ./prog1 pwd

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games pwd

Can You correct my program? Source code:

#include <sys/param.h>
#include <sys/stat.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    char *systemPath, *path, *fileName;
    struct stat statStruct;
    if (argc < 2){
        printf( "Nothing to don");
    return -1;
    }
    if ((systemPath = getenv("PATH")) == NULL)
    {
        perror( "Not found PATH!n ");
        return -1;
    }
        fileName = argv[1];
    printf("%s %sn", systemPath, fileName);

    while ((path = strsep(&systemPath, ":")) != NULL)
    {
        if ((stat(fileName, &statStruct) == 0) && S_ISREG(statStruct.st_mode) && (statStruct.st_mode & S_IRUSR))
        {
            printf("%sn", fileName);
            printf("%sn", systemPath);
            printf("%sn", path);
        }
    }
return 0;
}

Advertisement

Answer

You find the candidate directory using strsep, storing it in path. But then you don’t use this variable; the stat call just uses the base filename, which will therefore always be looked up in the current working directory.

You need to form the concatenation of path, a /, and the filename, and then stat that.

You will probably find snprintf useful.

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