asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags) { struct file *in; int error, fput_in; if (unlikely(!len)) return 0; error = -EBADF; in = fget_light(fdin, &fput_in); if (in) { if (in->f_mode & FMODE_READ) { int fput_out; struct file *out = fget_light(fdout, &fput_out); if (out) { if (out->f_mode & FMODE_WRITE) error = do_tee(in, out, len, flags); fput_light(out, fput_out); } } fput_light(in, fput_in); } return error; }
int command_tee (int argc, char **argv) { int i, in, out; char *ptr; in = STDIN_FILENO; out = STDOUT_FILENO; progname = argv[0]; for (i = 1; i < argc; ++i) { ptr = argv[i]; if (*ptr == '-') { while (*++ptr) switch (*ptr) { case '-': if (!strcmp (ptr, "-help")) puts (help_text); else if (!strcmp (ptr, "-version")) puts ("tee: version "VERSION); else terror ("invalid option `%s'", argv[i]); return (EXIT_SUCCESS); case 'a': flag_append = 1; continue; case 'i': flag_ignore = 1; continue; } } else { } } do_tee (in, out); return (EXIT_SUCCESS); }