Leer del archivo o stdin

Estoy escribiendo una utilidad que acepta un nombre de archivo o lee desde stdin.

Me gustaría conocer la forma más sólida / rápida de verificar si existe stdin (los datos se están canalizando al programa) y, de ser así, leer esos datos. Si no existe, el procesamiento se realizará en el nombre de archivo dado. He intentado usar la siguiente prueba para el tamaño destdin pero creo que, dado que es una secuencia y no un archivo real, no funciona como sospechaba que lo haría y siempre está imprimiendo-1. Sé que siempre podría leer el carácter de entrada 1 a la vez mientras! = EOF, pero me gustaría una solución más genérica para poder terminar con un fd o un FILE * si existe stdin para que el resto del programa funcione sin problemas . También me gustaría saber su tamaño, hasta que el programa anterior haya cerrado la transmisión.

long getSizeOfInput(FILE *input){
  long retvalue = 0;
  fseek(input, 0L, SEEK_END);
  retvalue = ftell(input);
  fseek(input, 0L, SEEK_SET);
  return retvalue;
}

int main(int argc, char **argv) {
  printf("Size of stdin: %ld\n", getSizeOfInput(stdin));
  exit(0);
}

Terminal:

$ echo "hi!" | myprog
Size of stdin: -1

Respuestas a la pregunta(6)

Su respuesta a la pregunta