How to make an application to prevent itself from launching from the command line?
I have a binary which should be launched by a daemon; but when somebody tries to launch the binary from command line, I should error out stating "cannot be launched from command line".
Tried googling but in vain.

My first approach would probably be to check the parent process and kill the program if the parent is a shell, like bash or csh.

Another approach would be to see if stdin is attached to a real terminal. A process that is spawned by a daemon would have no stdin device, or it would be /dev/null.

Comments
never mind.. i got it!

@deceptikon, i need to check parent name against all the possible shells.. is that what you are suggesting? sounds fine to me.. but i was looking for other approaches which would take lesser lines of code..
@rubberman, that makes sense.. will you please spare time to tell me how to check if stdin device of a process is /dev/null or not?

In C, you can #include <unistd.h> and then use the ttyname(0) function. It resturns a pointer to the terminal that fd 0 (stdin) is connected with, or NULL if it isn't attached to a terminal (or there is an error) - checking errno for ENOTTY will tell you if it is not attached. From the Linux ttyname(3) man page:

TTYNAME(3)                 Linux Programmer’s Manual                TTYNAME(3)

NAME
       ttyname, ttyname_r - return name of a terminal

SYNOPSIS
       #include <unistd.h>

       char *ttyname(int fd);

       int ttyname_r(int fd, char *buf, size_t buflen);

DESCRIPTION
       The function ttyname() returns a pointer to the null-terminated pathname of the terminal device that is open on
       the file descriptor fd, or NULL on error (for example, if fd is not connected to a terminal).  The return value
       may point to static data, possibly overwritten by the next call.  The function ttyname_r() stores this pathname
       in the buffer buf of length buflen.

RETURN VALUE
       The function ttyname() returns a pointer to a pathname on success.  On error, NULL is returned,  and  errno  is
       set appropriately.  The function ttyname_r() returns 0 on success, and an error number upon error.

ERRORS
       ttyname_r():

       EBADF  Bad file descriptor.

       ENOTTY File descriptor does not refer to a terminal device.

       ERANGE buflen was too small to allow storing the pathname.

CONFORMING TO
       4.2BSD, POSIX.1-2001.

SEE ALSO
       fstat(2), isatty(3)

COLOPHON
       This  page  is part of release 3.22 of the Linux man-pages project.  A description of the project, and informa-
       tion about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.

Linux                             2008-07-14                        TTYNAME(3)

@rubberman, thanks for the info!.. I think "isatty(STDIN_FILENO)" will serve my purpose..

This article has been dead for over six months. Start a new discussion instead.