linux/drivers/rtc/rtc-dev.c
<<
>>
Prefs
   1/*
   2 * RTC subsystem, dev interface
   3 *
   4 * Copyright (C) 2005 Tower Technologies
   5 * Author: Alessandro Zummo <a.zummo@towertech.it>
   6 *
   7 * based on arch/arm/common/rtctime.c
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12*/
  13
  14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  15
  16#include <linux/module.h>
  17#include <linux/rtc.h>
  18#include <linux/sched.h>
  19#include "rtc-core.h"
  20
  21static dev_t rtc_devt;
  22
  23#define RTC_DEV_MAX 16 /* 16 RTCs should be enough for everyone... */
  24
  25static int rtc_dev_open(struct inode *inode, struct file *file)
  26{
  27        int err;
  28        struct rtc_device *rtc = container_of(inode->i_cdev,
  29                                        struct rtc_device, char_dev);
  30        const struct rtc_class_ops *ops = rtc->ops;
  31
  32        if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags))
  33                return -EBUSY;
  34
  35        file->private_data = rtc;
  36
  37        err = ops->open ? ops->open(rtc->dev.parent) : 0;
  38        if (err == 0) {
  39                spin_lock_irq(&rtc->irq_lock);
  40                rtc->irq_data = 0;
  41                spin_unlock_irq(&rtc->irq_lock);
  42
  43                return 0;
  44        }
  45
  46        /* something has gone wrong */
  47        clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags);
  48        return err;
  49}
  50
  51#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
  52/*
  53 * Routine to poll RTC seconds field for change as often as possible,
  54 * after first RTC_UIE use timer to reduce polling
  55 */
  56static void rtc_uie_task(struct work_struct *work)
  57{
  58        struct rtc_device *rtc =
  59                container_of(work, struct rtc_device, uie_task);
  60        struct rtc_time tm;
  61        int num = 0;
  62        int err;
  63
  64        err = rtc_read_time(rtc, &tm);
  65
  66        spin_lock_irq(&rtc->irq_lock);
  67        if (rtc->stop_uie_polling || err) {
  68                rtc->uie_task_active = 0;
  69        } else if (rtc->oldsecs != tm.tm_sec) {
  70                num = (tm.tm_sec + 60 - rtc->oldsecs) % 60;
  71                rtc->oldsecs = tm.tm_sec;
  72                rtc->uie_timer.expires = jiffies + HZ - (HZ/10);
  73                rtc->uie_timer_active = 1;
  74                rtc->uie_task_active = 0;
  75                add_timer(&rtc->uie_timer);
  76        } else if (schedule_work(&rtc->uie_task) == 0) {
  77                rtc->uie_task_active = 0;
  78        }
  79        spin_unlock_irq(&rtc->irq_lock);
  80        if (num)
  81                rtc_handle_legacy_irq(rtc, num, RTC_UF);
  82}
  83static void rtc_uie_timer(unsigned long data)
  84{
  85        struct rtc_device *rtc = (struct rtc_device *)data;
  86        unsigned long flags;
  87
  88        spin_lock_irqsave(&rtc->irq_lock, flags);
  89        rtc->uie_timer_active = 0;
  90        rtc->uie_task_active = 1;
  91        if ((schedule_work(&rtc->uie_task) == 0))
  92                rtc->uie_task_active = 0;
  93        spin_unlock_irqrestore(&rtc->irq_lock, flags);
  94}
  95
  96static int clear_uie(struct rtc_device *rtc)
  97{
  98        spin_lock_irq(&rtc->irq_lock);
  99        if (rtc->uie_irq_active) {
 100                rtc->stop_uie_polling = 1;
 101                if (rtc->uie_timer_active) {
 102                        spin_unlock_irq(&rtc->irq_lock);
 103                        del_timer_sync(&rtc->uie_timer);
 104                        spin_lock_irq(&rtc->irq_lock);
 105                        rtc->uie_timer_active = 0;
 106                }
 107                if (rtc->uie_task_active) {
 108                        spin_unlock_irq(&rtc->irq_lock);
 109                        flush_scheduled_work();
 110                        spin_lock_irq(&rtc->irq_lock);
 111                }
 112                rtc->uie_irq_active = 0;
 113        }
 114        spin_unlock_irq(&rtc->irq_lock);
 115        return 0;
 116}
 117
 118static int set_uie(struct rtc_device *rtc)
 119{
 120        struct rtc_time tm;
 121        int err;
 122
 123        err = rtc_read_time(rtc, &tm);
 124        if (err)
 125                return err;
 126        spin_lock_irq(&rtc->irq_lock);
 127        if (!rtc->uie_irq_active) {
 128                rtc->uie_irq_active = 1;
 129                rtc->stop_uie_polling = 0;
 130                rtc->oldsecs = tm.tm_sec;
 131                rtc->uie_task_active = 1;
 132                if (schedule_work(&rtc->uie_task) == 0)
 133                        rtc->uie_task_active = 0;
 134        }
 135        rtc->irq_data = 0;
 136        spin_unlock_irq(&rtc->irq_lock);
 137        return 0;
 138}
 139
 140int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, unsigned int enabled)
 141{
 142        if (enabled)
 143                return set_uie(rtc);
 144        else
 145                return clear_uie(rtc);
 146}
 147EXPORT_SYMBOL(rtc_dev_update_irq_enable_emul);
 148
 149#endif /* CONFIG_RTC_INTF_DEV_UIE_EMUL */
 150
 151static ssize_t
 152rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 153{
 154        struct rtc_device *rtc = file->private_data;
 155
 156        DECLARE_WAITQUEUE(wait, current);
 157        unsigned long data;
 158        ssize_t ret;
 159
 160        if (count != sizeof(unsigned int) && count < sizeof(unsigned long))
 161                return -EINVAL;
 162
 163        add_wait_queue(&rtc->irq_queue, &wait);
 164        do {
 165                __set_current_state(TASK_INTERRUPTIBLE);
 166
 167                spin_lock_irq(&rtc->irq_lock);
 168                data = rtc->irq_data;
 169                rtc->irq_data = 0;
 170                spin_unlock_irq(&rtc->irq_lock);
 171
 172                if (data != 0) {
 173                        ret = 0;
 174                        break;
 175                }
 176                if (file->f_flags & O_NONBLOCK) {
 177                        ret = -EAGAIN;
 178                        break;
 179                }
 180                if (signal_pending(current)) {
 181                        ret = -ERESTARTSYS;
 182                        break;
 183                }
 184                schedule();
 185        } while (1);
 186        set_current_state(TASK_RUNNING);
 187        remove_wait_queue(&rtc->irq_queue, &wait);
 188
 189        if (ret == 0) {
 190                /* Check for any data updates */
 191                if (rtc->ops->read_callback)
 192                        data = rtc->ops->read_callback(rtc->dev.parent,
 193                                                       data);
 194
 195                if (sizeof(int) != sizeof(long) &&
 196                    count == sizeof(unsigned int))
 197                        ret = put_user(data, (unsigned int __user *)buf) ?:
 198                                sizeof(unsigned int);
 199                else
 200                        ret = put_user(data, (unsigned long __user *)buf) ?:
 201                                sizeof(unsigned long);
 202        }
 203        return ret;
 204}
 205
 206static unsigned int rtc_dev_poll(struct file *file, poll_table *wait)
 207{
 208        struct rtc_device *rtc = file->private_data;
 209        unsigned long data;
 210
 211        poll_wait(file, &rtc->irq_queue, wait);
 212
 213        data = rtc->irq_data;
 214
 215        return (data != 0) ? (POLLIN | POLLRDNORM) : 0;
 216}
 217
 218static long rtc_dev_ioctl(struct file *file,
 219                unsigned int cmd, unsigned long arg)
 220{
 221        int err = 0;
 222        struct rtc_device *rtc = file->private_data;
 223        const struct rtc_class_ops *ops = rtc->ops;
 224        struct rtc_time tm;
 225        struct rtc_wkalrm alarm;
 226        void __user *uarg = (void __user *) arg;
 227
 228        err = mutex_lock_interruptible(&rtc->ops_lock);
 229        if (err)
 230                return err;
 231
 232        /* check that the calling task has appropriate permissions
 233         * for certain ioctls. doing this check here is useful
 234         * to avoid duplicate code in each driver.
 235         */
 236        switch (cmd) {
 237        case RTC_EPOCH_SET:
 238        case RTC_SET_TIME:
 239                if (!capable(CAP_SYS_TIME))
 240                        err = -EACCES;
 241                break;
 242
 243        case RTC_IRQP_SET:
 244                if (arg > rtc->max_user_freq && !capable(CAP_SYS_RESOURCE))
 245                        err = -EACCES;
 246                break;
 247
 248        case err;
 126                if (
<2 href24code=CAP_SYS_TIME" class=q_data;
capable(capclass="sref">max_user_freq && !capable(EACCEEEEEEEEEass="sref">CAP_SYS_RESOURCE))
 245                        ssi2e_t
ERESTARTSYS"drivers/rtc/rtc-dev.c#L246" id="L246" class="line" name="L246"> 246                break;
rtc_d2v_read(struct 
 114        rtc_device *<2 href25>        return ( 230                return DECLARE_WAITQUEUE2/a>(<25e" name="L247"> 247POLLIN | onOURCE))
                break;
data;
ss2ze_t ret<>
    ef="drivers/rtc/rtc-dev.c#L235" iD(         * for cs="sref">2ount != sizeof(unsig2ed in2) &/span>
         * for csref">ssi2lass="sref">EINVAL;
2a hre2="driv/span>
 , sov.c#L233"          * for csf">rtc_d2class="line" name="L163"2 163<2a>    /span>
         * for csid="L1542ef">add_wait_queue(&2mp;
         * for cse" class2" id="L165" class="line"2name=26         * for csd="L156"2te" class="sref">__set_c2rrent26="L236" class="line" name="L236"> 236 but dual-bootlasswith MS-Windows impli=s          * for csE" class2class="line" name="L167"2 167<2a>    6" class="line" name="L236"> 236 cod233" local wall c29         * for csd="L248" ass="sref">spin_lock_irq2/a>(&2mp; 236        switch (data =  237        case spin_unlock2irq(&ADame="L126"> 126AD>                if (uie_task_af="+coock" c->ops_lock);
 229        if (data != 0) {
<2 href27>        case ret = 0;
mutex_lock_interruptible(& 2rass="sreline"ivers/rtc/rtc-dev.c# href="drivers/rtc/rtc-desref">irq_queue,  226         if ( 230   ne" na                       176            id="L231" class="line" name="L231"> 231
file->ret = -irq_queue,  226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22,ame="L20" class="line" name="L225"> 225   )                       179"drivers/rtc/rtc-dev.c#L246" id="L246" class=FAULs="line" name="L=FAULs>
 180    id="L231" class="line" name="L231"> 231
signal_p2nding28>        ret = -                if (uie_task_af="+coock" c->ops_lock);
 229        if (schedule();
ops_lock);
 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22,a/rtc/rtc-dev.c#  225   )                       176            id="L2 id="L246" class=FAULs="line" name="L=FAULs>
set_current_state2/a>(<28>                remove_wait_queue2/a>(&28p;rline" name="L226"> 226    id="L131" classss="line" name="L143"> 143   >        struct rtc-> 226    id="L131" class)) {
 == 0) {
irq_data = 0;line" name="L226"> 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lwdayme="L225"> 225 = 0;line" name="L226"> 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lydayme="L225"> 225rtc->opsc_data = 0;line" name="L226"> 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lisds" name="L212"> 2="lisds"c#L246"               if (data = data);

         * for cid="L195"2class="line" name="L195"2 195<29         * for citc/rtc-d2&&
 23""""""""/rev.cday/month/year fields, justrev.cd233" 26         * for cie" class2"sref">count == size2f(uns29>    6" class="line" name="L236"> 23""""""""/r33" right valuesdev.ctho26"fields4/a>         * for cie" class2s="sref">ret =  23""""""""//a>         * for cid="L189"2int);
         * for crtc/rtc-d2v.c#L200" id="L200" clas2="lin29>    ef="drivers/rtc/rtc-dev.c#L235"""""""""/relimin"lin33" neassline" separ"lin244"A clp) id=",dit/a>         * for 3=ret" cla3s="sref">ret =          * for 3(unsigned3long);

         * for 3.c#L203" 3d="L203" class="line" na3e="L230>    /span>
         * for 3ss="sref"3ret;
         * for 3 id="L2053 class="line" name="L2053> 20530         * for 3 5d="L2053 amp;&
 23""""""""/        switch (rtc_dev_po3l30e" name="L247"> 247 20830e=put_user" class="sref">put_c#L220" id="L220" class="linenow name="L212"> 2now"L22,a/rtc/rtc-dev.c#33"n name="L212"> 2=3"n>
rtc_device *<3 href30>        if (data;
irrrrrrrrrlass="sref">mutex_lock_interruptible(&tm);
 124        if (EACCE="L230" class="line" name="L230"> 230   ne" na                      3oll_wait( 231
rtc->ops_lock);
 124  id="L124" class="line"now name="L212"> 2now"L22      if ( =  175 = 0;line" name="L226"> 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lmdayme="L225"> 225);
 124   id="L131" class="lmdayme="L225"> 225data != 0) ? (EACCES;
 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lmon name="L212"> 2="lmonc#L246"s_lock);
 124   id="L131" class="lmon name="L212"> 2="lmonc#L2     if (;
 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lyearme="L225"> 225);
 124   id="L131" class="lyearme="L225"> 225put_user( 230   n(& 124rassvalid_ n="sref">ops_lock);
 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22      if (rtc_dev_ioctl3struc31ass="line" name="L179"> 179 230   ne" na                      cmd, u3signe3 long  231
put_user(ops_lock);
 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22,af">ops_lock);
 2=3"n>
er3 = 0;
/* chec3ce" class3"sref">rtc_device *<3 href32ode=rtc" class="sref">rtc->
        switch (rtc_clas3_ops<32s="sref">data);
<"> 179 2=3"n>
 2now"L22 /     case rtc_time  175put_user( 124rass=id=ltovenm);
 2now"L22 +"24 * 60 * 60id="L124" class="line" name="L124"> 124        if (rtc_wkalrm EACCEef">put_user( 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lmdayme="L225"> 225);
 124   id="L131" class="lmdayme="L225"> 225put_user( 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lmon name="L212"> 2="lmonc#L246"s_lock);
 124   id="L131" class="lmon name="L212"> 2="lmonc#L2     if (put_ef">put_user( 226    id="L131" class=rs/rtc/rtc-dev.c#L id="L22 id="L131" class="lyearme="L225"> 225);
 124   id="L131" class="lyearme="L225"> 225err 179er3)
 180                if (err;
        ( 2rass hreline"m);
 226         if (        case ->ops_lock);
 229        if (
static unsigned int cmd) {
mutex_lock_interruptible(&tm);
 124        if (RTC_EPOCH_SET 230   ne" na                      RTC_SET_TIME:3 179 231
capable(        if (err = -irq_queue, < name="L124"> 124  idme="L20" class="line" name="L225"> 225   )                       242mutex_lock_interruptible(&a id="L246" class=FAULs="line" name="L=FAULs>
 231
RTC_IRQP_SET:3arg >  239                if (!err = -->ops_lock);
 229        if (ops_lock);
 124  id/rtc/rtc-dev.c#  225   )                      err;
 179

<3 href34>        if (();
 124        if (ssi3e_t
/* chec3ef">rtc_d3v_read(struct  126                if (mutex_lock_interruptible(&rtc_device *<3 href35rivers/rtc/rtc-dev.c#a>
static unsigned int DECLARE_WAITQUEUE3/a>(<35e" name="L247L126" id="L126" class="line" FFame="L126"> 126                if (data;
rex_lock_interruptible(&         if (3ount != sizeof(unsig3ed in36(& 126                if (ssi3lass="sref">EINVAL;
3a hre36task_active" class="sref">uie_task_af="+coock" c->ops_lock);
 229        if (rtc_d3class="line" name="L163"3 163<36ode=rtc" class="sref" id="L231" class="linerass26);
);
add_wait_queue(&3mp; 126                if (__set_c3rrent36de=EACCES" class="sreL185" id="L185"f="+coock" c->ops_lock);
 229        if (spin_lock_irq3/a>(&36>        case data =  126                if (rtc->irq_data = 0;f="+coock" c->ops_lock);
 229        if (spin_unlock3irq( slass 143);
 slass 143);
        /* chec3a" class=3sref">data != 0) {
<3 href37ode=rtc" clasL126" id="L126" class="lUne" FFame="L126"> 126                if (ret = 0;
mutf="+coock" c->ops_lock);
 229        if (( slass 143);
 slass 143);
static unsigned int file-> 244                if (ret = -rex_lock_interruptible(& 220{
        if (signal_p3nding38(&ADame="L126"> 126 244">AD>                if (ret = -uie_task_aex_lock_interruptible(&__use href="drivers/rtc/rtc-dev.c#L229" id="L229" lass>capable(capclas class="sref">buf) ?:
schedule();
 126                if ( 176   lass="sref">mutf="+coock" c->ops_lock);
 229        if (set_current_state3/a>(<38ned int))
ops_lock);
 226   id/rtc/rtc-dev.c#  226                          remove_wait_queue3/a>(&38p;        if (irc#L162"user( 2rass hreline"m);
 226         if (
39>        rtc-> 126                if (data = uie_task_af="+coock" c->ops_lock);
 229        if (data);
rex_lock_interruptible(& 2rass="sreline"ivers/rtc/rtc-dev.c# href="drivers/rtc/rtc-desref">irq_queue,  226         if ( 230   ne" na                       176            id="L231" class="line" name="L231"> 231
count == size3f(uns39>                ret = irq_queue,  226   srme="L20" class="line" line" name="L226"> 226                           179"drivers/rtc/rtc-dev.c#L246" id="L246" class=FAULs="line" name="L=FAULs>
 180    id="L231" class="line" name="L231"> 231
ret =         switch (;
data);
 224   v.c#L229" id="L229" l="L2able( 175 = 0;ex_lock_interruptible(& 224   v.c#L229" id="L229" l="L2able(__use href="drivers/rtc/rtc-dev.c#L229" id="L229" C_Eef="drivers/rtcC_Ec-de id="L131" class 237 id4" class="line"l name="L220"> 220{
 176           ="L230" class="line" name="L230"> 230   n=6" id="L246" class=NOIOCTLCMDame="L126"> 126=NOIOCTLCMD>{
count == size4l40e" name="L247"> 247 179"drivers/rtc/rtc-dev.c#L246" id="L246" class=NOTTYame="L126"> 126=NOTTY>
ret =  20840e=put_user" class="sr} elsehref="drivers/rtc/rtc-dev.c#L232"4=8d="L2054 nt);
 179"drivers/rtc/rtc-dev.c#L246" id="L246" class=NOTTYame="L126"> 126=NOTTY>
ira>
4oll_wait(/* chec4id="L213"4class="line" name="L213"4 213<41ode=r229" id="L229" ConOURCE))
                if ( = dataref">uie_task_af="+coock" c->ops_lock);
 229        if ( 231
data != 0) ? ( 2f idstruclamp; 2onc#L2a    rtc_dev_ioctl4struc41ass="     case cmd, u4signe4 long  sdatar  sdata>
__usef" name="L237"> 2f idmp; 2onc#L2sref">irq_queue, < href="drivers/rtc/rtc-dev.c#L229" id="L229" asynr_queu/UNNING);
        if (er4 = 0;
rtc_device *<4 href42>        case rtc_clas4_ops<42s="srASK_ic i_lamp;((rtc_time rtc_wkalrm  sdatar  sdata>
                

         * for 4f">err         * for 4"sref">er4)
  (UIE) ... currrs/ly only managassthroughsd="L23/a>         * for 4err" clas4="sref">err;

         * for 4esref">er4class="line" name="L232"4 232<43"driv/span>
         * for 4ee" class4calling task has appropr4ate p43>    /span>
         * for 4e_class_o4tls. doing this check he4e is 43eful
 r, or bnausassby kernels/a> , and ds a one-shotseen_laanyway4/a>         * for 4oid dupli4ate code in each driver.4/span43        switch (
static unsigned int cmd) {
RTC_EPOCH_SET(   ass="sref">__usefi);
 126   id0      RTC_SET_TIME:4 slass 143);
 slass 143);
capable(err = - 224   v.c#L229" id="L229" releas/UNNING);
   a     224   v.c#L229" id="L229" releas/UNNING);
   ass="sref">__use href="drivers/rtc/rtc-dev.c#L229" id="L229" C_Eef="drivers/rtcC_Ec-de id="L131" classRTC_IRQP_SET:4arg > ->   ass="sref">__use 126irq_queue, < href="drivers/rtc/rtc-dev.c#L229" id="L229" flagaame="L224"> 224flaga>         err = -        case err;
 224rass=sp_fclac-de(&a     case 
<4 href449ss="line" na id="L131" classowevers/rtc/rtc-dev.owevede=rtc" class=&->
);
(struct (((   s    case rtc_device *<4 href45rivers/rtc/rt id="L131" classop"n name="L212"> 2op"nde=rtc" class="& 2rass=sp_op"n>   s    case DECLARE_WAITQUEUE4/a>(<45e" name="L247 id="L131" classfasynref="drivers/rtcfasynr="sr" class="&data;
         if (    ef="drivers/rtc/rtc-de/*s="ser_ion/removal hookss         switch (4ount != sizeof(unsig4ed in46>        ssi4lass="sref">EINVAL;
4a hre46task_voidamp;);
rtc_d4class="line" name="L163"4 163<46ode=r     case add_wait_queue(&4mp;__set_c4rrent46>static unsigned int );
 126spin_lock_irq4/a>(&46de=EAGAIN" class="sre class="sref">r=sp_dbname="L220"> 220=sp_dbn="sref">ops_lock);
"%s: too manyi->data = rtc->spin_unlock4irq        __use href="drivers/rtc/rtc-dev.c#L229" id="L229" C_Eef="drivers/rtcC_Ec-de id="L131" class=sp/r    ass="sref">__useMAJORr __use hrs=sp/r );
data != 0) {
<4 href47>        case ret = 0;
ops_lock);
->ops_lock);
bu="L201" class="l href="drivers/rtc/rtc-dea     if (file->ret = -ops_lock);
irq_queue, < hrs=sp_fclaame="L224"> 224rass=sp_fclac-dea     if (signal_p4nding48(&             if (ret = -/* chec4="drivers4rtc/rtc-dev.c#L183" id="4183" 4lass="voidamp;);
schedule();
ops_lock);
__use href="drivers/rtc/rtc-dev.c#L229" id="L229" C_Eef="drivers/rtcC_Ec-de id="L131" class=sp/r  176   lass="sref">mut=sp_warn name="L212"> 2=sp_warn="sref">ops_lock);
"%s: failassto add char =spic/ %d:%d\n"/a>set_current_state4/a>(<48ned int))
->__useMAJORr __use hrs=sp/r );
remove_wait_queue4/a>(&48p;r=sp_dbname="L220"> 220=sp_dbn="sref">ops_lock);
"%s: C_E (%d:%d)\n"/a>-> == 0) {
irme="L179 class="sref">rMAJORr __use hrs=sp/r );

49(&             if (rtc->        /* chec4/"drivers4ss="sref">data = );
 176   ef="+code=count"=sp_delr ops_lock);
count == size4f(uns49>                 if (ret = ret =  231
/* chec5.c#L203" 5d="L203" class="line" na5e="L250ass="line" namp; 231
 2alloc_chr=sp_region="sref">ops_lock);
 126
;
 231
 231pr_" n>   as>
  char =sp region\n"/a>count == size5l50>                ret =  20850e=putvoidamp; 2unregister_chr=sp_region>   ass="sref">__use hrs=sp/r  1265oll_wait(


2/div>


The original LXR software by=33"          http://sourceforge.net/projects/lxr">LXR tc/runi/yc-de, this experirtc-al f (lxr@" nux.noc-de 
2/div>

lxr." nux.no kindly hostassby          http://www.redpill-" npro.no">Redpill L npro ASc-de, provider of L nux consultlassand operK_ions serpic/s since 1995.
2/div>