Hi errno in sys/stat.h

How should I use errno in a c program and what info does it have .
I am working with directories and files.
So can any one tell me How to access errno?I am using the stat() function on \etc directory and I am alble to access only the half of the directories.I am not able to access other half and stat()call returns a -1.So what is wrong?
Thanks in advance. :slight_smile:

Using the system errno is very important in C programming. All system calls will tell you there is an error by returning a -1, or NULL, or EOF, but only the errno variable, which is set by the system can tell you what the error is. To use it in a program, you need simply include the errno header file and define it as an external int.

#include <stdio.h>
#include <errno.h>

    extern int        errno;

int main ( int argc , char * const argv [ ] , char * const envp [ ] )
{
    return (0);
}

You can also get a textual description using the perror(3C) function.

#include <stdio.h>
#include <errno.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>

    extern int        errno;


int main ( int argc , char * const argv [ ] , char * const envp [ ] )
{
    char *          cpString = "/file/that/is/not/there";
    struct stat     Status;

    if ( stat (cpString, &Status) == -1 )
    {
        perror (cpString);
    }

    return (0);
}

# ./a.out
/file/that/is/not/there: No such file or directory

A little function I use in most of my programs for displaying system error messages follows. It uses the string function strerror(3C) to display a text message for any given errno value.

#include <stdio.h>
#include <errno.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>

    extern int        errno;


    int syserr ( const char Format [ ] , char * S1 , char * S2 )
    {
        fprintf (stderr, Format, ( S1 ? S1 : "" ), ( S2 ? S2 : "" ));
        fprintf (stderr, " (%d, %s)\n", errno,
                 ( (S1 = strerror (errno)) ? S1 : "undefined error" ));

        return (errno);
    }

    

int main ( int argc , char * const argv [ ] , char * const envp [ ] )
{
    char *          cpString = "/file/that/is/not/there";
    struct stat     Status;

    if ( stat (cpString, &Status) == -1 )
    {
        syserr ("Unable to %s %s", "status", cpString);
    }

    return (0);
}


# ./a.out
Unable to status /file/that/is/not/there (2, No such file or directory)

Thank you,hegemaro!
So,Can I use it with stat() call?
If it has a integer value ,How can I know which value is which?
Like there are many type of errors that can be generarted like no access permissions etc.So how can a assosiate a particular errno no with a particular type of error.

The values for errno for any system call are defined in the manual pages for that system call. Being an integer, yes, you can test it against any of the constant values as defined in errno.h (actually /usr/include/sys/errno.h under Solaris 8). A code snippet might look like this:

if ( stat (cpString, &Status) == -1 )
{
    if ( errno == ENOENT )
    {
        fprintf (stderr, "The file doesn't exist\n");
    }
    else if ( errno == ENOPERM )
    {
        fprintf (stderr, "I don't have permission to read that file\n");
    }
    else
    {
        syserr ("Unable to %s %s", "status", cpString);
    }
}

Of course, rather than just writing messages to stderr, you could include code to acutally do something useful.

Thank you!got it.

According to the latest Posix Standard:

This means that:
extern int errno;
is not legal anymore. You are supposed to include errno.h and depend on that include file to define errno for you. You will get unpredicable behavior if you use the external variable in a multi-threaded process.

Perderabo,Than you!
I want to use it to know whether stat() call functions in a way desired or if it
exited with an error then what made it exit.
I will try your way too.Thank you!