fd.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 109 行

C
109
字号
/*  * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) * Licensed under the GPL */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <termios.h>#include <errno.h>#include "user.h"#include "user_util.h"#include "chan_user.h"struct fd_chan {	int fd;	int raw;	struct termios tt;	char str[sizeof("1234567890\0")];};void *fd_init(char *str, int device, struct chan_opts *opts){	struct fd_chan *data;	char *end;	int n;	if(*str != ':'){		printk("fd_init : channel type 'fd' must specify a file "		       "descriptor\n");		return(NULL);	}	str++;	n = strtoul(str, &end, 0);	if((*end != '\0') || (end == str)){		printk("fd_init : couldn't parse file descriptor '%s'\n", str);		return(NULL);	}	data = um_kmalloc(sizeof(*data));	if(data == NULL) return(NULL);	*data = ((struct fd_chan) { .fd  	= n,				    .raw  	= opts->raw });	return(data);}int fd_open(int input, int output, int primary, void *d, char **dev_out){	struct fd_chan *data = d;	int err;	if(data->raw && isatty(data->fd)){		CATCH_EINTR(err = tcgetattr(data->fd, &data->tt));		if(err)			return(err);		err = raw(data->fd);		if(err)			return(err);	}	sprintf(data->str, "%d", data->fd);	*dev_out = data->str;	return(data->fd);}void fd_close(int fd, void *d){	struct fd_chan *data = d;	int err;	if(data->raw && isatty(fd)){		CATCH_EINTR(err = tcsetattr(fd, TCSAFLUSH, &data->tt));		if(err)			printk("Failed to restore terminal state - "			       "errno = %d\n", -err);		data->raw = 0;	}}int fd_console_write(int fd, const char *buf, int n, void *d){	struct fd_chan *data = d;	return(generic_console_write(fd, buf, n, &data->tt));}struct chan_ops fd_ops = {	.type		= "fd",	.init		= fd_init,	.open		= fd_open,	.close		= fd_close,	.read		= generic_read,	.write		= generic_write,	.console_write	= fd_console_write,	.window_size	= generic_window_size,	.free		= generic_free,	.winch		= 1,};/* * Overrides for Emacs so that we follow Linus's tabbing style. * Emacs will notice this stuff at the end of the file and automatically * adjust the settings for this buffer only.  This must remain at the end * of the file. * --------------------------------------------------------------------------- * Local variables: * c-file-style: "linux" * End: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?