📄 ppp_mod.c
字号:
/* * ppp_mod.c - modload support for PPP pseudo-device driver. * * Copyright (c) 1994 The Australian National University. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation is hereby granted, provided that the above copyright * notice appears in all copies. This software is provided without any * warranty, express or implied. The Australian National University * makes no representations about the suitability of this software for * any purpose. * * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY * OF SUCH DAMAGE. * * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * * $Id: ppp_mod.c,v 1.1 2000/04/18 23:51:29 masputra Exp $ *//* * This file is used under Solaris 2. */#include <sys/types.h>#include <sys/param.h>#include <sys/stat.h>#include <sys/conf.h>#include <sys/modctl.h>#include <sys/sunddi.h>#include <sys/ksynch.h>#ifdef __STDC__#define __P(x) x#else#define __P(x) ()#endifstatic int ppp_identify __P((dev_info_t *));static int ppp_attach __P((dev_info_t *, ddi_attach_cmd_t));static int ppp_detach __P((dev_info_t *, ddi_detach_cmd_t));static int ppp_devinfo __P((dev_info_t *, ddi_info_cmd_t, void *, void **));extern struct streamtab pppinfo;extern krwlock_t ppp_lower_lock;static dev_info_t *ppp_dip;static struct cb_ops cb_ppp_ops = { nulldev, nulldev, nodev, nodev, /* cb_open, ... */ nodev, nodev, nodev, nodev, /* cb_dump, ... */ nodev, nodev, nodev, nochpoll, /* cb_devmap, ... */ ddi_prop_op, /* cb_prop_op */ &pppinfo, /* cb_stream */ D_NEW|D_MP|D_MTQPAIR|D_MTOUTPERIM|D_MTOCEXCL /* cb_flag */};static struct dev_ops ppp_ops = { DEVO_REV, /* devo_rev */ 0, /* devo_refcnt */ ppp_devinfo, /* devo_getinfo */ ppp_identify, /* devo_identify */ nulldev, /* devo_probe */ ppp_attach, /* devo_attach */ ppp_detach, /* devo_detach */ nodev, /* devo_reset */ &cb_ppp_ops, /* devo_cb_ops */ NULL /* devo_bus_ops */};/* * Module linkage information */static struct modldrv modldrv = { &mod_driverops, /* says this is a pseudo driver */ "PPP-2.3 multiplexing driver", &ppp_ops /* driver ops */};static struct modlinkage modlinkage = { MODREV_1, (void *) &modldrv, NULL};int_init(void){ return mod_install(&modlinkage);}int_fini(void){ return mod_remove(&modlinkage);}int_info(mip) struct modinfo *mip;{ return mod_info(&modlinkage, mip);}static intppp_identify(dip) dev_info_t *dip;{ return strcmp(ddi_get_name(dip), "ppp") == 0? DDI_IDENTIFIED: DDI_NOT_IDENTIFIED;}static intppp_attach(dip, cmd) dev_info_t *dip; ddi_attach_cmd_t cmd;{ if (cmd != DDI_ATTACH) return DDI_FAILURE; if (ddi_create_minor_node(dip, "ppp", S_IFCHR, 0, DDI_PSEUDO, CLONE_DEV) == DDI_FAILURE) { ddi_remove_minor_node(dip, NULL); return DDI_FAILURE; } rw_init(&ppp_lower_lock, NULL, RW_DRIVER, NULL); return DDI_SUCCESS;}static intppp_detach(dip, cmd) dev_info_t *dip; ddi_detach_cmd_t cmd;{ rw_destroy(&ppp_lower_lock); ddi_remove_minor_node(dip, NULL); return DDI_SUCCESS;}static intppp_devinfo(dip, cmd, arg, result) dev_info_t *dip; ddi_info_cmd_t cmd; void *arg; void **result;{ int error; error = DDI_SUCCESS; switch (cmd) { case DDI_INFO_DEVT2DEVINFO: if (ppp_dip == NULL) error = DDI_FAILURE; else *result = (void *) ppp_dip; break; case DDI_INFO_DEVT2INSTANCE: *result = NULL; break; default: error = DDI_FAILURE; } return error;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -