⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irda_deflate.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	state->stats.unc_bytes += isize;	state->stats.unc_packets++;	return olen;}static voidz_comp_stats(arg, stats)    void *arg;    struct compstat *stats;{	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	*stats = state->stats;}static void z_decomp_free(void *arg){	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	if (state) {		inflateEnd(&state->strm);		kfree(state);		MOD_DEC_USE_COUNT;	}}/* * Allocate space for a decompressor. */static void *z_decomp_alloc(options, opt_len)    unsigned char *options;    int opt_len;{	struct irda_deflate_state *state;	int w_size;	if (opt_len != CILEN_DEFLATE	    || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)	    || options[1] != CILEN_DEFLATE	    || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL	    || options[3] != DEFLATE_CHK_SEQUENCE)		return NULL;	w_size = DEFLATE_SIZE(options[2]);	w_size = MAX_WBITS;	if (w_size < DEFLATE_MIN_SIZE || w_size > DEFLATE_MAX_SIZE)		return NULL;	state = (struct irda_deflate_state *) kmalloc(sizeof(*state), GFP_KERNEL);	if (state == NULL)		return NULL;	MOD_INC_USE_COUNT;	memset (state, 0, sizeof (struct irda_deflate_state));	state->w_size        = w_size;	state->strm.next_out = NULL;	state->strm.zalloc   = zalloc_init;	state->strm.zfree    = zfree;	if (inflateInit2(&state->strm, -w_size) != Z_OK)		goto out_free;	state->strm.zalloc = zalloc;	return (void *) state;out_free:	z_decomp_free(state);	MOD_DEC_USE_COUNT;	return NULL;}static intz_decomp_init(arg, options, opt_len, unit, hdrlen, mru, debug)    void *arg;    unsigned char *options;    int opt_len, unit, hdrlen, mru, debug;{	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	if (opt_len < CILEN_DEFLATE	    || (options[0] != CI_DEFLATE && options[0] != CI_DEFLATE_DRAFT)	    || options[1] != CILEN_DEFLATE	    || DEFLATE_METHOD(options[2]) != DEFLATE_METHOD_VAL	    || DEFLATE_SIZE(options[2]) != state->w_size	    || options[3] != DEFLATE_CHK_SEQUENCE)		return 0;	state->seqno = 0;	state->unit  = unit;	state->debug = debug;	state->mru   = mru;	inflateReset(&state->strm);	return 1;}static void z_decomp_reset(void *arg){	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	state->seqno = 0;	inflateReset(&state->strm);}/* * Decompress a Deflate-compressed packet. * * Because of patent problems, we return DECOMP_ERROR for errors * found by inspecting the input data and for system problems, but * DECOMP_FATALERROR for any errors which could possibly be said to * be being detected "after" decompression.  For DECOMP_ERROR, * we can issue a CCP reset-request; for DECOMP_FATALERROR, we may be * infringing a patent of Motorola's if we do, so we take CCP down * instead. * * Given that the frame has the correct sequence number and a good FCS, * errors such as invalid codes in the input most likely indicate a * bug, so we return DECOMP_FATALERROR for them in order to turn off * compression, even though they are detected by inspecting the input. */intz_decompress(arg, ibuf, isize, obuf, osize)    void *arg;    unsigned char *ibuf;    int isize;    unsigned char *obuf;    int osize;{	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	int olen, r;	int overflow;	unsigned char overflow_buf[1];	if (isize <= DEFLATE_OVHD) {		if (state->debug)			printk(KERN_DEBUG "z_decompress%d: short pkt (%d)\n",			       state->unit, isize);		return DECOMP_ERROR;	}	/*	 * Set up to call inflate.	 */	state->strm.next_in = ibuf;	state->strm.avail_in = isize;	state->strm.next_out = obuf;	state->strm.avail_out = osize;	overflow = 0;	/*	 * Call inflate, supplying more input or output as needed.	 */	for (;;) {		r = inflate(&state->strm, Z_PACKET_FLUSH);		if (r != Z_OK) {			if (state->debug)				printk(KERN_DEBUG "z_decompress%d: inflate returned %d (%s)\n",				       state->unit, r, (state->strm.msg? state->strm.msg: ""));			return DECOMP_FATALERROR;		}		if (state->strm.avail_out != 0)			break;		/* all done */				if (!overflow) {			/*			 * We've filled up the output buffer; the only way to			 * find out whether inflate has any more characters			 * left is to give it another byte of output space.			 */			state->strm.next_out = overflow_buf;			state->strm.avail_out = 1;			overflow = 1;		} else {			if (state->debug)				printk(KERN_DEBUG "z_decompress%d: ran out of mru\n",				       state->unit);			return DECOMP_FATALERROR;		}	}	olen = osize + overflow - state->strm.avail_out;	state->stats.unc_bytes += olen;	state->stats.unc_packets++;	state->stats.comp_bytes += isize;	state->stats.comp_packets++;	return olen;}/* * Incompressible data has arrived - add it to the history. */static voidz_incomp(arg, ibuf, icnt)    void *arg;    unsigned char *ibuf;    int icnt;{	struct irda_deflate_state *state = (struct irda_deflate_state *) arg;	int r;	/*	 * Check that the protocol is one we handle.	 */	/*	 * We start at the either the 1st or 2nd byte of the protocol field,	 * depending on whether the protocol value is compressible.	 */	state->strm.next_in = ibuf;	state->strm.avail_in = icnt;	r = inflateIncomp(&state->strm);	if (r != Z_OK) {		/* gak! */		if (state->debug) {			printk(KERN_DEBUG "z_incomp%d: inflateIncomp returned %d (%s)\n",			       state->unit, r, (state->strm.msg? state->strm.msg: ""));		}		return;	}	/*	 * Update stats.	 */	state->stats.inc_bytes += icnt;	state->stats.inc_packets++;	state->stats.unc_bytes += icnt;	state->stats.unc_packets++;}/************************************************************* * Module interface table *************************************************************//* These are in ppp.c */extern int  irda_register_compressor   (struct compressor *cp);extern void irda_unregister_compressor (struct compressor *cp);/* * Procedures exported to if_ppp.c. */static struct compressor irda_deflate = {compress_proto:	CI_DEFLATE,comp_alloc:	z_comp_alloc,comp_free:	z_comp_free,comp_init:	z_comp_init,comp_reset:	z_comp_reset,compress:	z_compress,comp_stat:	z_comp_stats,decomp_alloc:	z_decomp_alloc,decomp_free:	z_decomp_free,decomp_init:	z_decomp_init,decomp_reset:	z_decomp_reset,decompress:	z_decompress,incomp:		z_incomp,decomp_stat:	z_comp_stats};static struct compressor irda_deflate_draft = {compress_proto:	CI_DEFLATE_DRAFT,comp_alloc:	z_comp_alloc,comp_free:	z_comp_free,comp_init:	z_comp_init,comp_reset:	z_comp_reset,compress:	z_compress,comp_stat:	z_comp_stats,decomp_alloc:	z_decomp_alloc,decomp_free:	z_decomp_free,decomp_init:	z_decomp_init,decomp_reset:	z_decomp_reset,decompress:	z_decompress,incomp:		z_incomp,decomp_stat:	z_comp_stats};int __init irda_deflate_init(void){        int answer = irda_register_compressor ( &irda_deflate);        if (answer == 0)                printk (KERN_INFO			"IrDA Deflate Compression module registered\n");	irda_register_compressor( &irda_deflate_draft);        return answer;}void irda_deflate_cleanup(void){	irda_unregister_compressor (&irda_deflate);	irda_unregister_compressor (&irda_deflate_draft);}#ifdef MODULE/************************************************************* * Module support routines *************************************************************/int init_module(void){  	return irda_deflate_init();}     voidcleanup_module(void){	if (MOD_IN_USE)		printk (KERN_INFO			"Deflate Compression module busy, remove delayed\n");	else {		irda_deflate_cleanup();	}}#endif

⌨️ 快捷键说明

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