I have seen one too many instances of checking strtol () results wrong, so, for the record:
Update: Sigh, two too many, a portable check for empty input added.
To convert const char *str to a long, properly checking for overflow, invalid trailing characters and empty input, it is necessary to do the following:
char *p; errno = 0; result = strtol(str, &p, base); if (errno != 0 || *p != 0 || p == str) error_handling ();
It is necessary to check both errno and *p; if you don't check errno, you get 0 for empty input and LONG_MAX or LONG_MIN for overflow or underflow. On empty input the return value is 0 and errno might be set to EINVAL; the portable way of checking for empty input is comparing p and str.
This will still accept strings that start with white space; check for !isspace((unsigned char)*str) if you want to reject them.
I hope that helps someone.