editar - ¿Cómo puedo obtener el código fuente para la cola de la utilidad linux?
linux easytag (4)
Este comando es realmente muy útil, pero puedo obtener el código fuente para ver qué ocurre dentro.
Gracias .
La utilidad cola es parte de los coreutils en linux.
- Fuente tarball: ftp://ftp.gnu.org/gnu/coreutils/coreutils-7.4.tar.gz
- Archivo fuente: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c
Siempre he encontrado que FreeBSD tiene un código fuente mucho más claro que las utilidades gnu. Así que aquí está tail.c en el proyecto FreeBSD:
Poke alrededor del sitio uclinux. Dado que distribuyeron el software, deben hacer que la fuente esté disponible de una manera u otra.
O bien, podría leer man fseek
y adivinar cómo podría hacerse.
NB: vea los comentarios de William a continuación, hay casos en los que no puede usar buscar
Puede que te resulte un ejercicio interesante escribir el tuyo. La gran mayoría de las herramientas de línea de comandos de Unix son aproximadamente una página de código C bastante sencillo.
Para ver el código, las fuentes de GNU CoreUtils se encuentran fácilmente en gnu.org o en su sitio favorito de réplica de Linux.
/`*This example implements the option n of tail command.*/`
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <getopt.h>
#define BUFF_SIZE 4096
FILE *openFile(const char *filePath)
{
FILE *file;
file= fopen(filePath, "r");
if(file == NULL)
{
fprintf(stderr,"Error opening file: %s/n",filePath);
exit(errno);
}
return(file);
}
void printLine(FILE *file, off_t startline)
{
int fd;
fd= fileno(file);
int nread;
char buffer[BUFF_SIZE];
lseek(fd,(startline + 1),SEEK_SET);
while((nread= read(fd,buffer,BUFF_SIZE)) > 0)
{
write(STDOUT_FILENO, buffer, nread);
}
}
void walkFile(FILE *file, long nlines)
{
off_t fposition;
fseek(file,0,SEEK_END);
fposition= ftell(file);
off_t index= fposition;
off_t end= fposition;
long countlines= 0;
char cbyte;
for(index; index >= 0; index --)
{
cbyte= fgetc(file);
if (cbyte == ''/n'' && (end - index) > 1)
{
countlines ++;
if(countlines == nlines)
{
break;
}
}
fposition--;
fseek(file,fposition,SEEK_SET);
}
printLine(file, fposition);
fclose(file);
}
int main(int argc, char *argv[])
{
FILE *file;
file= openFile(argv[2]);
walkFile(file, atol(argv[1]));
return 0;
}
/*Note: take in mind that i not wrote code to parse input options and arguments, neither code to check if the lines number argument is really a number.*/