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.

Recommended Answers

All 5 Replies

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.

commented: never mind.. i got it! +0

@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..

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.