yunchan.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:7k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Unix compatibility routines
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * Administration Building, AG-44
  9.  * Seattle, WA  98195
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 14 September 1996
  13.  * Last Edited: 14 July 1999
  14.  *
  15.  * Copyright 1999 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made available
  24.  * "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. /* DEDICATION
  36.  *
  37.  *  This file is dedicated to my dog, Unix, also known as Yun-chan and
  38.  * Unix J. Terwilliker Jehosophat Aloysius Monstrosity Animal Beast.  Unix
  39.  * passed away at the age of 11 1/2 on September 14, 1996, 12:18 PM PDT, after
  40.  * a two-month bout with cirrhosis of the liver.
  41.  *
  42.  *  He was a dear friend, and I miss him terribly.
  43.  *
  44.  *  Lift a leg, Yunie.  Luv ya forever!!!!
  45.  */
  46.  
  47. /* Emulator for BSD flock() call
  48.  * Accepts: file descriptor
  49.  *     operation bitmask
  50.  * Returns: 0 if successful, -1 if failure
  51.  */
  52. /*  Our friends in Redmond have decided that you can not write to any segment
  53.  * which has a shared lock.  This screws up the shared-write mailbox drivers
  54.  * (mbx, mtx, and tenex).  As a workaround, we'll only lock the first byte of
  55.  * the file, meaning that you can't write that byte shared.
  56.  *  This behavior seems to be new as of NT 4.0.
  57.  */
  58. int flock (int fd,int op)
  59. {
  60.   HANDLE hdl = (HANDLE) _get_osfhandle (fd);
  61.   DWORD flags = (op & LOCK_NB) ? LOCKFILE_FAIL_IMMEDIATELY : 0;
  62.   OVERLAPPED offset = {NIL,NIL,0,0,NIL};
  63.   int ret = -1;
  64.   blocknotify_t bn = (blocknotify_t) 
  65.     ((op & LOCK_NB) ? NIL : mail_parameters (NIL,GET_BLOCKNOTIFY,NIL));
  66.   if (hdl < 0) errno = EBADF; /* error in file descriptor */
  67.   else switch (op & ~LOCK_NB) { /* translate to LockFileEx() op */
  68.   case LOCK_EX: /* exclusive */
  69.     flags |= LOCKFILE_EXCLUSIVE_LOCK;
  70.   case LOCK_SH: /* shared */
  71.     if (!check_nt ()) return 0; /* always succeeds if not NT */
  72.     if (bn) (*bn) (BLOCK_FILELOCK,NIL);
  73. /* bug for bug compatible with Unix */
  74.     UnlockFileEx (hdl,NIL,1,0,&offset);
  75. /* lock the file as requested */
  76.     if (LockFileEx (hdl,flags,NIL,1,0,&offset)) ret = 0;
  77.     if (bn) (*bn) (BLOCK_NONE,NIL);
  78. /* if failed */
  79.     if (ret) errno = (op & LOCK_NB) ? EAGAIN : EBADF;
  80.     break;
  81.   case LOCK_UN: /* unlock */
  82.     if (check_nt ()) UnlockFileEx (hdl,NIL,1,0,&offset);
  83.     ret = 0; /* always succeeds */
  84.   default: /* default */
  85.     errno = EINVAL; /* bad call */
  86.     break;
  87.   }
  88.   return ret;
  89. }
  90. /* Local storage */
  91. static char *loghdr; /* log file header string */
  92. static HANDLE loghdl = NIL; /* handle of event source */
  93. /* Emulator for BSD syslog() routine
  94.  * Accepts: priority
  95.  *     message
  96.  *     parameters
  97.  */
  98. void syslog (int priority,const char *message,...)
  99. {
  100.   va_list args;
  101.   LPTSTR strs[2];
  102.   char tmp[MAILTMPLEN]; /* callers must be careful not to pop this */
  103.   unsigned short etype;
  104.   if (!check_nt ()) return; /* no-op on non-NT system */
  105. /* default event source */
  106.   if (!loghdl) openlog ("c-client",LOG_PID,LOG_MAIL);
  107.   switch (priority) { /* translate UNIX type into NT type */
  108.   case LOG_ALERT:
  109.     etype = EVENTLOG_ERROR_TYPE;
  110.     break;
  111.   case LOG_INFO:
  112.     etype = EVENTLOG_INFORMATION_TYPE;
  113.     break;
  114.   default:
  115.     etype = EVENTLOG_WARNING_TYPE;
  116.   }
  117.   va_start (args,message); /* initialize vararg mechanism */
  118.   vsprintf (tmp,message,args); /* build message */
  119.   strs[0] = loghdr; /* write header */
  120.   strs[1] = tmp; /* then the message */
  121. /* report the event */
  122.   ReportEvent (loghdl,etype,(unsigned short) priority,2000,NIL,2,0,strs,NIL);
  123.   va_end (args);
  124. }
  125. /* Emulator for BSD openlog() routine
  126.  * Accepts: identity
  127.  *     options
  128.  *     facility
  129.  */
  130. void openlog (const char *ident,int logopt,int facility)
  131. {
  132.   char tmp[MAILTMPLEN];
  133.   if (!check_nt ()) return; /* no-op on non-NT system */
  134.   if (loghdl) fatal ("Duplicate openlog()!");
  135.   loghdl = RegisterEventSource (NIL,ident);
  136.   sprintf (tmp,(logopt & LOG_PID) ? "%s[%d]" : "%s",ident,getpid ());
  137.   loghdr = cpystr (tmp); /* save header for later */
  138. }
  139. /* Copy Unix string with CRLF newlines
  140.  * Accepts: destination string
  141.  *     pointer to size of destination string buffer
  142.  *     source string
  143.  *     length of source string
  144.  * Returns: length of copied string
  145.  */
  146. unsigned long unix_crlfcpy (char **dst,unsigned long *dstl,char *src,
  147.     unsigned long srcl)
  148. {
  149.   unsigned long i,j;
  150.   char *d = src;
  151. /* count number of LF's in source string(s) */
  152.   for (i = srcl,j = 0; j < srcl; j++) if (*d++ == '12') i++;
  153. /* flush destination buffer if too small */
  154.   if (*dst && (i > *dstl)) fs_give ((void **) dst);
  155.   if (!*dst) { /* make a new buffer if needed */
  156.     *dst = (char *) fs_get ((*dstl = i) + 1);
  157.     if (dstl) *dstl = i; /* return new buffer length to main program */
  158.   }
  159.   d = *dst; /* destination string */
  160. /* copy strings, inserting CR's before LF's */
  161.   while (srcl--) switch (*src) {
  162.   case '15': /* unlikely carriage return */
  163.     *d++ = *src++; /* copy it and any succeeding linefeed */
  164.     if (srcl && *src == '12') {
  165.       *d++ = *src++;
  166.       srcl--;
  167.     }
  168.     break;
  169.   case '12': /* line feed? */
  170.     *d++ ='15'; /* yes, prepend a CR, drop into default case */
  171.   default: /* ordinary chararacter */
  172.     *d++ = *src++; /* just copy character */
  173.     break;
  174.   }
  175.   *d = ''; /* tie off destination */
  176.   return d - *dst; /* return length */
  177. }
  178. /* Length of Unix string after unix_crlfcpy applied
  179.  * Accepts: source string
  180.  * Returns: length of string
  181.  */
  182. unsigned long unix_crlflen (STRING *s)
  183. {
  184.   unsigned long pos = GETPOS (s);
  185.   unsigned long i = SIZE (s);
  186.   unsigned long j = i;
  187.   while (j--) switch (SNX (s)) {/* search for newlines */
  188.   case '15': /* unlikely carriage return */
  189.     if (j && (CHR (s) == '12')) {
  190.       SNX (s); /* eat the line feed */
  191.       j--;
  192.     }
  193.     break;
  194.   case '12': /* line feed? */
  195.     i++;
  196.   default: /* ordinary chararacter */
  197.     break;
  198.   }
  199.   SETPOS (s,pos); /* restore old position */
  200.   return i;
  201. }