Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

`tee` returns `EINVAL` for every pair of pipes

Aperta
#429 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
40/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
c, linux, macos

Direzione di ricerca

Start in sys_tee in src/syscall/io.c, where the early EINVAL return and its comment explain why copying without consuming is refused on macOS. The reproducer in the issue shows the target behaviour: tee should return the byte count, leave the source pipe readable, and copy into the destination. Done means that reproducer prints tee=5 errno=0 with both reads returning 5 bytes. Expect to find a workable approach to peeking a pipe on macOS first, which is the hard part.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement

sys_tee (src/syscall/io.c) returns EINVAL without looking at its arguments. Its comment gives the reason: copying without consuming needs a way to look into a pipe, and macOS offers none.

Reproducer:

#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int in[2], out[2];
    char buf[8];
    pipe(in);
    pipe(out);
    write(in[1], "hello", 5);

    errno = 0;
    long n = tee(in[0], out[1], 100, SPLICE_F_NONBLOCK);
    printf("tee=%ld errno=%d\n", n, errno);
    if (n > 0)
        printf("copied=%zd still in the source=%zd\n",
               read(out[0], buf, sizeof(buf)), read(in[0], buf, sizeof(buf)));
    return 0;
}
result
elfuse b57f367 tee=-1 errno=22
Linux 6.12 under qemu tee=5 errno=0, then copied=5 still in the source=5

EINVAL is what tee(2) documents for descriptors that are not both pipes, so that is how a guest reads the refusal.

Lingua principale
C
Stelle
271
Fork
28
Merge medio
2g 17h
PR unite (30g)
17

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di sysprog21/elfuse

Tutte le issue di sysprog21/elfuse

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.