ttyname le dirá el nombre de la terminal conectada a un descriptor de archivo dado; por ejemplo, ttyname(0)
le dirá la terminal de stdin.
Por supuesto, esto fallará si se redirige la entrada o la salida.
Salvo eso, puede verificar varias variables de entorno (SSH_CONNECTION
, SSH_CLIENT
, REMOTEHOST
, DISPLAY
, SESSIONNAME
). Wireshark tiene lógica para detectar si se está ejecutando de forma remota para que no capture el tráfico de red que genera; puede que le interese la lógica que usa su función get_conn_cfilter para implementar esto.
Verificar el valor de retorno de ttyname(3) contra su stdin debería darle el nombre de la terminal que está alimentando la entrada de su proceso.
Será /dev/console si el programa se está ejecutando en la consola (y no tiene su entrada redirigida). También puede verificar stdout para ver si está conectado a /dev/console; vea cuál se adapta mejor a su escenario de uso.
Vería las variables de entorno como una señal razonable de lo que está pasando. No estoy seguro de qué API de C querrías para eso, pero estoy seguro de que existe una.
Por ejemplo, tanto el SSH_CLIENT
o SSH_CONNECTION
las variables de entorno se configuran en mi máquina independientemente del cliente SSH que se utilice.
Puede valer la pena verificar qué tan universales son estos en función del servidor SSH que se ejecuta en la máquina.
Dependiendo de cuánto le preocupe que se falsifique, una verificación fácil sería la presencia/ausencia de las variables de entorno SSH_CLIENT y SSH_CONNECTION, en cuyo caso desearía el getenv
función.