1/* 2 * Buffered file io for ffmpeg system 3 * Copyright (c) 2001 Fabrice Bellard 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include "libavutil/avstring.h" 23#include "avformat.h" 24#include <fcntl.h> 25#if HAVE_SETMODE 26#include <io.h> 27#endif 28#include <unistd.h> 29#include <sys/time.h> 30#include <stdlib.h> 31#include "os_support.h" 32 33 34/* standard file protocol */ 35 36static int file_open(URLContext *h, const char *filename, int flags) 37{ 38 int access; 39 int fd; 40 41 av_strstart(filename, "file:", &filename); 42 43 if (flags & URL_RDWR) { 44 access = O_CREAT | O_TRUNC | O_RDWR; 45 } else if (flags & URL_WRONLY) { 46 access = O_CREAT | O_TRUNC | O_WRONLY; 47 } else { 48 access = O_RDONLY; 49 } 50#ifdef O_BINARY 51 access |= O_BINARY; 52#endif 53 fd = open(filename, access, 0666); 54 if (fd < 0) 55 return AVERROR(ENOENT); 56 h->priv_data = (void *)(size_t)fd; 57 return 0; 58} 59 60static int file_read(URLContext *h, unsigned char *buf, int size) 61{ 62 int fd = (size_t)h->priv_data; 63 return read(fd, buf, size); 64} 65 66static int file_write(URLContext *h, unsigned char *buf, int size) 67{ 68 int fd = (size_t)h->priv_data; 69 return write(fd, buf, size); 70} 71 72/* XXX: use llseek */ 73static int64_t file_seek(URLContext *h, int64_t pos, int whence) 74{ 75 int fd = (size_t)h->priv_data; 76 return lseek(fd, pos, whence); 77} 78 79static int file_close(URLContext *h) 80{ 81 int fd = (size_t)h->priv_data; 82 return close(fd); 83} 84 85URLProtocol file_protocol = { 86 "file", 87 file_open, 88 file_read, 89 file_write, 90 file_seek, 91 file_close, 92}; 93 94/* pipe protocol */ 95 96static int pipe_open(URLContext *h, const char *filename, int flags) 97{ 98 int fd; 99 char *final; 100 av_strstart(filename, "pipe:", &filename); 101 102 fd = strtol(filename, &final, 10); 103 if((filename == final) || *final ) {/* No digits found, or something like 10ab */ 104 if (flags & URL_WRONLY) { 105 fd = 1; 106 } else { 107 fd = 0; 108 } 109 } 110#if HAVE_SETMODE 111 setmode(fd, O_BINARY); 112#endif 113 h->priv_data = (void *)(size_t)fd; 114 h->is_streamed = 1; 115 return 0; 116} 117 118URLProtocol pipe_protocol = { 119 "pipe", 120 pipe_open, 121 file_read, 122 file_write, 123}; 124