BBSˮľÇ廪վ¡Ã¾«»ªÇø

·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux        
±ê  Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-¸½B 
·¢ÐÅÕ¾: BBS Ë®Ä¾Ç廪վ (Wed Mar 15 14:32:22 2000) 
 
 
 
 
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix  
±ê  Ìâ: unix»·¾³¸ß¼¶±à³Ì--¸½Â¼B ÆäËûÔ´´úÂë  
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 14:31:25 2000), ×ªÐÅ  
   
¸½Â¼ B  
ÆäËüÔ´´úÂë  
B.1 ÎÒÃǵÄÍ·Îļþ  
        ÔÚÊéÕýÎÄÖеĴó¶àÊý³ÌÐò¶¼°üº¬Í·Îļþourhdr.h£¬ÕâʾÓÚ³ÌÐòB.1ÖС£ÆäÖж¨ÒåÁË  
³£Êý£¨ÀýÈçMAXLINE£©ºÍÎÒÃÇ×ԱຯÊýµÄÔ­ÐÍ¡£  
        ÒòΪ´ó¶àÊý³ÌÐòÐò°üº¬ÏÂÁÐÍ·Îļþ£º<stdio.h>¡¢<stdlib.h>£¨ÆäÖÐÓÐexitº¯ÊýÔ­  
ÐÍ£©£¬ÒÔ¼°<unistd.h>£¨ÆäÖаüº¬ËùÓбê×¼Unixº¯ÊýµÄÔ­ÐÍ£©£¬ËùÒÔourhdr.h°üº¬  
ÁËÕâЩϵͳͷÎļþ£¬Í¬Ê±»¹°üº¬ÁË<string.h>¡£ÕâÑù¾Í¼õÉÙÁ˱¾ÊéÕýÎÄÖÐËùÓгÌÐò  
µÄ³¤¶È¡£  
/* Our own header, to be included *after* all standard system headers *  
/  
#ifndef __ourhdr_h  
#define __ourhdr_h  
#include        <sys/types.h>   /* required for some of our prototypes */  
#include        <stdio.h>               /* for convenience */  
#include        <stdlib.h>              /* for convenience */  
#include        <string.h>              /* for convenience */  
#include        <unistd.h>              /* for convenience */  
#define MAXLINE 4096                    /* max line length */  
#define FILE_MODE       (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)  
                                        /* default file access permissions for n  
w files */  
#define DIR_MODE        (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)  
                                        /* default permissions for new directori  
s */  
typedef void    Sigfunc(int);   /* for signal handlers */  
                                        /* 4.3BSD Reno <signal.h> doesn't define  
SIG_ERR */  
#if     defined(SIG_IGN) && !defined(SIG_ERR)  
#define SIG_ERR ((Sigfunc *)-1)  
#endif  
#define min(a,b)        ((a) < (b) ? (a) : (b))  
#define max(a,b)        ((a) > (b) ? (a) : (b))  
                                        /* prototypes for our own functions */  
char    *path_alloc(int *);                     /* {Prog pathalloc} */  
int              open_max(void);                        /* {Prog openmax} */  
void     clr_fl(int, int);                      /* {Prog setfl} */  
void     set_fl(int, int);                      /* {Prog setfl} */  
void     pr_exit(int);                          /* {Prog prexit} */  
void     pr_mask(const char *);         /* {Prog prmask} */  
Sigfunc *signal_intr(int, Sigfunc *);/* {Prog signal_intr_function} */  
int              tty_cbreak(int);                       /* {Prog raw} */  
int              tty_raw(int);                          /* {Prog raw} */  
int              tty_reset(int);                        /* {Prog raw} */  
void     tty_atexit(void);                      /* {Prog raw} */  
#ifdef  ECHO    /* only if <termios.h> has been included */  
struct termios  *tty_termios(void);     /* {Prog raw} */  
#endif  
void     sleep_us(unsigned int);        /* {Ex sleepus} */  
ssize_t  readn(int, void *, size_t);/* {Prog readn} */  
ssize_t  writen(int, const void *, size_t);/* {Prog writen} */  
int              daemon_init(void);                     /* {Prog daemoninit} */  
int              s_pipe(int *);                         /* {Progs svr4_spipe bsd  
spipe} */  
int              recv_fd(int, ssize_t (*func)(int, const void *, size_t));  
                                                                        /* {Prog  
 recvfd_svr4 recvfd_43bsd} */  
int              send_fd(int, int);                     /* {Progs sendfd_svr4 se  
dfd_43bsd} */  
int              send_err(int, int, const char *);/* {Prog senderr} */  
int              serv_listen(const char *);     /* {Progs servlisten_svr4 servli  
ten_4  
4bsd} */  
int              serv_accept(int, uid_t *);     /* {Progs servaccept_svr4 servac  
ept_4  
4bsd} */  
int              cli_conn(const char *);        /* {Progs cliconn_svr4 cliconn_4  
bsd} */  
int              buf_args(char *, int (*func)(int, char **));  
                                                                        /* {Prog  
bufargs} */  
int              ptym_open(char *);                     /* {Progs ptyopen_svr4 p  
yopen_44bsd} */  
int              ptys_open(int, char *);        /* {Progs ptyopen_svr4 ptyopen_4  
bsd} */  
#ifdef  TIOCGWINSZ  
pid_t    pty_fork(int *, char *, const struct termios *,  
                                  const struct winsize *);      /* {Prog ptyfork  
 */  
#endif  
int             lock_reg(int, int, int, off_t, int, off_t);  
                                                                        /* {Prog  
lockreg} */  
#define read_lock(fd, offset, whence, len) \  
                        lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)  
#define readw_lock(fd, offset, whence, len) \  
                        lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)  
#define write_lock(fd, offset, whence, len) \  
                        lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)  
#define writew_lock(fd, offset, whence, len) \  
                        lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)  
#define un_lock(fd, offset, whence, len) \  
                        lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)  
pid_t   lock_test(int, int, off_t, int, off_t);  
                                                                        /* {Prog  
locktest} */  
#define is_readlock(fd, offset, whence, len) \  
                        lock_test(fd, F_RDLCK, offset, whence, len)  
#define is_writelock(fd, offset, whence, len) \  
                        lock_test(fd, F_WRLCK, offset, whence, len)  
void    err_dump(const char *, ...);    /* {App misc_source} */  
void    err_msg(const char *, ...);  
void    err_quit(const char *, ...);  
void    err_ret(const char *, ...);  
void    err_sys(const char *, ...);  
void    log_msg(const char *, ...);             /* {App misc_source} */  
void    log_open(const char *, int, int);  
void    log_quit(const char *, ...);  
void    log_ret(const char *, ...);  
void    log_sys(const char *, ...);  
void    TELL_WAIT(void);                /* parent/child from {Sec race_condition  
} */  
void    TELL_PARENT(pid_t);  
void    TELL_CHILD(pid_t);  
void    WAIT_PARENT(void);  
void    WAIT_CHILD(void);  
#endif  /* __ourhdr_h */  
³ÌÐòB.1 ÎÒÃǵÄÍ·Îļþourhdr.h  
        ÔÚ³ÌÐòÖÐÏȰüÀ¨Ò»°ãϵͳͷÎļþ,È»ºóÔÙ°üÀ¨ourhdr.h£¬ÕâÑù¾ÍÄܽâ¾öijЩϵͳ  
Ö®¼äµÄ²î±ð£¨ÀýÈç4.3BSDRenoÖÐûÓж¨ÒåSIG_ERR£©£¬²¢ÇÒÒ²¿É¶¨ÒåһЩÎÒÃǵĺ¯  
ÊýÔ­ÐÍ£¬¶øÕâЩ½öµ±°üÀ¨Ò»°ãϵͳͷÎļþÖ®ºó²ÅÊÇÐèÒªµÄ¡£µ±ÉÐ䶨Òåij¸ö½á¹¹¾Í  
ÔÚÔ­ÐÍÖÐÒýÓøýṹʱ£¬Ä³Ð©ANSI C±àÒë»áÈÏΪ²»Õý³£¡£  
B.2 ±ê×¼³ö´í´¦ÀíÀý³Ì  
        ÎÒÃÇÌṩÁËÁ½Ì׳ö´í´¦ÀíÀý³Ì£¬ËüÃÇÓÃÓÚ±¾ÊéÖдó¶àÊýʵÀýÒÔ´¦Àí¸÷ÖÖ³ö´íÇé¿ö  
¡£Ò»Ì×Àý³ÌÒÔerr_¿ªÍ·£¬²¢Ïò±ê×¼³ö´íÎļþÊä³öÒ»Ìõ³ö´íÏûÏ¢¡£ÁíÒ»Ì×Àý³ÌÒÔlog  
_¿ªÍ·£¬ÓÃÓÚ¾«Áé½ø³Ì£¨µÚÊ®ÈýÕ£©£¬ËüÃǶà°ëûÓпØÖÆÖÕ¶Ë¡£  
        ÌṩÁËÕâЩ³ö´í´¦Àíº¯Êýºó£¬Ö»ÒªÔÚ³ÌÐòÖÐдһÐдúÂë¾Í¿ÉÒÔ½øÐгö´í´¦Àí£¬Àý  
È磺  
                if (³ö´íÌõ¼þ)  
                        err_dump(´øÈÎÒâ²ÎÊýµÄprintf¸ñʽ);  
ÕâÑùÒ²¾Í²»ÔÙÐèҪʹÓÃÏÂÁдúÂ룺  
                if (³ö´íÌõ¼þ) {  
                        char    buff[200];  
                        sprintf(buff, ´øÈÎÒâ²ÎÊýµÄprintf¸ñʽ);  
                        perror(buff);  
                        abort( );  
                }  
        ÎÒÃǵijö´í´¦Àíº¯ÊýʹÓÃÁËANSI CµÄ±ä³¤²ÎÊý±í¹¦ÄÜ¡£ÆäÏêϸ˵Ã÷¼ûKernighanºÍ  
Ritchie[1998]µÄ7.3½Ó¡£Ó¦µ±×¢ÒâµÄÊÇÕâÒ»ANSI C¹¦ÄÜÓë½ÏÔçϵͳ£¨ÀýÈçSVR3ºÍ4  
.3BSD£©ÌṩµÄvarargs¹¦Äܲ»Í¬¡£ºêµÄÃû×ÖÏàͬ£¬µ«¸ü¸ÄÁËijЩºêµÄ²ÎÊý¡£  
        Í¼B.1ÁгöÁ˸÷¸ö³ö´í´¦Àíº¯ÊýÖ®¼äµÄÇø±ð¡£  
Function        strerror(errno)?        Teerminate?  
Err_ret         yes                     return;  
Err_sys         yes                     exit£¨0£©;  
Err_dump        yes                     abort();  
Err_msg         no                      return;  
Err_quit        no                      exit(1);  
Log_ret         yes                     return;  
Log_sys         yes                     exit(2);  
Log_msg         no                      return;  
                if (³ö´íÌõ¼þ)  
                        err_dump(´øÈÎÒâ²ÎÊýµÄprintf¸ñʽ);  
ÕâÑùÒ²¾Í²»ÔÙÐèҪʹÓÃÏÂÁдúÂ룺  
                if (³ö´íÌõ¼þ) {  
                        char    buff[200];  
                        sprintf(buff, ´øÈÎÒâ²ÎÊýµÄprintf¸ñʽ);  
                        perror(buff);  
                        abort( );  
                }  
        ÎÒÃǵijö´í´¦Àíº¯ÊýʹÓÃÁËANSI CµÄ±ä³¤²ÎÊý±í¹¦ÄÜ¡£ÆäÏêϸ˵Ã÷¼ûKernighanºÍ  
Ritchie[1998]µÄ7.3½Ó¡£Ó¦µ±×¢ÒâµÄÊÇÕâÒ»ANSI C¹¦ÄÜÓë½ÏÔçϵͳ£¨ÀýÈçSVR3ºÍ4  
.3BSD£©ÌṩµÄvarargs¹¦Äܲ»Í¬¡£ºêµÄÃû×ÖÏàͬ£¬µ«¸ü¸ÄÁËijЩºêµÄ²ÎÊý¡£  
        Í¼B.1ÁгöÁ˸÷¸ö³ö´í´¦Àíº¯ÊýÖ®¼äµÄÇø±ð¡£  
Function        strerror(errno)?        Teerminate?  
Err_ret         yes                     return;  
Err_sys         yes                     exit£¨0£©;  
Err_dump        yes                     abort();  
Err_msg         no                      return;  
Err_quit        no                      exit(1);  
Log_ret         yes                     return;  
Log_sys         yes                     exit(2);  
Log_msg         no                      return;  
Log_quit        no                      exit(2);  
   
ͼB.1  ÎÒÃǵıê×¼³ö´í´¦Àíº¯Êý  
³ÌÐòB.2°üÀ¨ÁËÊä³öÖÁ±ê×¼³ö´íÎļþµÄ¸÷¸ö³ö´í´¦Àíº¯Êý¡£  
#include <errno.h>  /* for definition of errno */  
#include <stdarg.h>  /* ANSI C header file */  
#include "ourhdr.h"  
static void err_doit(int, const char *, va_list);  
char *pname = NULL;  /* caller can set this from argv[0] */  
/* Nonfatal error related to a system call.  
 * Print a message and return. */  
void  
err_ret(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 err_doit(1, fmt, ap);  
 va_end(ap);  
 return;  
}  
/* Fatal error related to a system call.  
 * Print a message and terminate. */  
void  
err_sys(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 err_doit(1, fmt, ap);  
 va_end(ap);  
 exit(1);  
}  
/* Fatal error related to a system call.  
 * Print a message, dump core, and terminate. */  
void  
err_dump(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 err_doit(1, fmt, ap);  
 va_end(ap);  
 abort();  /* dump core and terminate */  
 exit(1);  /* shouldn't get here */  
}  
/* Nonfatal error unrelated to a system call.  
 * Caller specifies "errnoflag". */  
static void  
err_doit(int errnoflag, const char *fmt, va_list ap)  
{  
 int  errno_save;  
 char buf[MAXLINE];  
 errno_save = errno;  /* value caller might want printed */  
 vsprintf(buf, fmt, ap);  
 if (errnoflag)  
  sprintf(buf+strlen(buf), ": %s", strerror(errno_save));  
 strcat(buf, "\n");  
 fflush(stdout);  /* in case stdout and stderr are the same */  
 fputs(buf, stderr);  
 fflush(stderr);  /* SunOS 4.1.* doesn't grok NULL argument */  
 return;  
}  
³ÌÐòB.2  Êä³öÖÁ±ê×¼³ö´íÎļþµÄ³ö´í´¦Àíº¯Êý  
 ³ÌÐòB.3°üÀ¨Á˸÷log_xxx³ö´í´¦Àíº¯Êý¡£Èô½ø³Ì²»ÒÔ¾«Áé½ø³Ì·½Ê½½øÐУ¬ÄÇôµ÷  
ÓÃÕßÓ¦µ±¶¨Òå±äÁ¿debug£¬²¢½«ÆäÉèÖÃΪ·Ç0Öµ¡£ÔÚÕâÖÖÇé¿öÏ£¬³ö´íÏûÏ¢±»ËÍÖÁ±ê  
×¼³ö´íÎļþ¡£Èôdebug±ê־Ϊ0£¬ÔòʹÓÃsyslog¹¦ÄÜ£¨¼û13.4.2½Ú£©¡£  
/* Error routines for programs that can run as a daemon. */  
#include <errno.h>  /* for definition of errno */  
#include <stdarg.h>  /* ANSI C header file */  
#include <syslog.h>  
#include "ourhdr.h"  
static void log_doit(int, int, const char *, va_list ap);  
extern int debug;  /* caller must define and set this:  
         nonzero if interactive, zero if daemon */  
/* Initialize syslog(), if running as daemon. */  
void  
log_open(const char *ident, int option, int facility)  
{  
 if (debug == 0)  
  openlog(ident, option, facility);  
}  
/* Nonfatal error related to a system call.  
 * Print a message with the system's errno value and return. */  
void  
log_ret(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 log_doit(1, LOG_ERR, fmt, ap);  
 va_end(ap);  
 return;  
}  
/* Fatal error related to a system call.  
 * Print a message and terminate. */  
void  
log_sys(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 log_doit(1, LOG_ERR, fmt, ap);  
 va_end(ap);  
 exit(2);  
}  
/* Nonfatal error unrelated to a system call.  
 * Print a message and return. */  
void  
log_msg(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 log_doit(0, LOG_ERR, fmt, ap);  
 va_end(ap);  
 return;  
}  
/* Fatal error unrelated to a system call.  
 * Print a message and terminate. */  
void  
log_quit(const char *fmt, ...)  
{  
 va_list  ap;  
 va_start(ap, fmt);  
 log_doit(0, LOG_ERR, fmt, ap);  
 va_end(ap);  
 exit(2);  
}  
/* Print a message and return to caller.  
 * Caller specifies "errnoflag" and "priority". */  
static void  
log_doit(int errnoflag, int priority, const char *fmt, va_list ap)  
{  
 int  errno_save;  
 char buf[MAXLINE];  
 errno_save = errno;  /* value caller might want printed */  
 vsprintf(buf, fmt, ap);  
 
 if (errnoflag)  
  sprintf(buf+strlen(buf), ": %s", strerror(errno_save));  
 strcat(buf, "\n");  
 if (debug) {  
  fflush(stdout);  
  fputs(buf, stderr);  
  fflush(stderr);  
 } else  
  syslog(priority, buf);  
 return;  
}  
³ÌÐòB.3  ÓÃÓÚ¾«Áé½ø³ÌµÄ´¦Àíº¯Êý  
   
   
ý  
   
--  
 
 
-- 
¡ù À´Ô´:¡¤BBS Ë®Ä¾Ç廪վ smth.org¡¤[FROM: 202.38.248.38] 

BBSˮľÇ廪վ¡Ã¾«»ªÇø