diff options
author | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-09-10 08:49:47 +0800 |
---|---|---|
committer | victor <victor@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-09-10 08:49:47 +0800 |
commit | 540cfa70e8e8b4db3cc2addccfcbeeb69fffa033 (patch) | |
tree | 6a4dec7d69249e48a6f79c4436eb634cb28744b2 /mbbsd | |
parent | a8a0ef3c4d10bf576054dc26348d9b4e6efeecc2 (diff) | |
download | pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar.gz pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar.bz2 pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar.lz pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar.xz pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.tar.zst pttbbs-540cfa70e8e8b4db3cc2addccfcbeeb69fffa033.zip |
merge back from branch victor.solaris
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2189 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/admin.c | 4 | ||||
-rw-r--r-- | mbbsd/bbs.c | 4 | ||||
-rw-r--r-- | mbbsd/brc.c | 12 | ||||
-rw-r--r-- | mbbsd/cache.c | 2 | ||||
-rw-r--r-- | mbbsd/chat.c | 2 | ||||
-rw-r--r-- | mbbsd/chc.c | 12 | ||||
-rw-r--r-- | mbbsd/edit.c | 20 | ||||
-rw-r--r-- | mbbsd/io.c | 2 | ||||
-rw-r--r-- | mbbsd/mail.c | 6 | ||||
-rw-r--r-- | mbbsd/mbbsd.c | 45 | ||||
-rw-r--r-- | mbbsd/name.c | 2 | ||||
-rw-r--r-- | mbbsd/osdep.c | 487 | ||||
-rw-r--r-- | mbbsd/talk.c | 8 | ||||
-rw-r--r-- | mbbsd/term.c | 6 | ||||
-rw-r--r-- | mbbsd/topsong.c | 2 | ||||
-rw-r--r-- | mbbsd/user.c | 8 |
16 files changed, 504 insertions, 118 deletions
diff --git a/mbbsd/admin.c b/mbbsd/admin.c index f115bf46..de40efe1 100644 --- a/mbbsd/admin.c +++ b/mbbsd/admin.c @@ -1012,7 +1012,7 @@ auto_scan(char fdata[][STRLEN], char ans[]) } } for (i = 0; fdata[5][i]; i++) { - if (isdigit(fdata[5][i])) + if (isdigit((int)fdata[5][i])) count++; } @@ -1196,7 +1196,7 @@ scan_register_form(char *regfile, int automode, int neednum) fp = fopen(buf1, "w"); for(i = 0; buf[i] && i < sizeof(buf); i++){ - if (!isdigit(buf[i])) + if (!isdigit((int)buf[i])) continue; fprintf(fp, "[退回原因] 請%s\n", reason[buf[i] - '0']); diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 26080e1d..94a4b7f7 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -798,7 +798,7 @@ invalid_brdname(char *brd) register char ch, rv=0; ch = *brd++; - if (!isalpha(ch)) + if (!isalpha((int)ch)) rv = 2; while ((ch = *brd++)) { if (not_alnum(ch) && ch != '_' && ch != '-' && ch != '.') @@ -1802,7 +1802,7 @@ view_postmoney(int ent, fileheader_t * fhdr, char *direct) /* When the file is anonymous posted, fhdr->money is author. * see do_general() */ vmsg("匿名管理編號: %d (同一人號碼會一樣)", - fhdr->money + currutmp->pid); + fhdr->money + (int)currutmp->pid); else vmsg("這一篇文章值 %d 銀", fhdr->money); return FULLUPDATE; diff --git a/mbbsd/brc.c b/mbbsd/brc.c index 7e61e578..45b001a4 100644 --- a/mbbsd/brc.c +++ b/mbbsd/brc.c @@ -96,8 +96,9 @@ time_t * brc_find_record(int bid, int *num) { char *p; - *num = 0; - p = brc_findrecord_in(brc_buf, brc_buf + brc_size, bid, (brcnbrd_t*)num); + brcnbrd_t tnum; + p = brc_findrecord_in(brc_buf, brc_buf + brc_size, bid, &tnum); + *num = tnum; if (p) return (time_t*)(p + sizeof(brcbid_t) + sizeof(brcnbrd_t)); *num = 0; @@ -187,7 +188,7 @@ brc_insert_record(brcbid_t bid, brcnbrd_t num, time_t* list) num--; /* don't write the times before brc_expire_time */ if (!ptr) { - brc_size -= tnum; + brc_size -= (int)tnum; /* put on the beginning */ if (num){ @@ -333,8 +334,9 @@ brc_initialize(){ int brc_read_record(int bid, int *num, time_t *list){ char *ptr; - *num = 0; - ptr = brc_findrecord_in(brc_buf, brc_buf + brc_size, bid, (brcnbrd_t*)num); + brcnbrd_t tnum; + ptr = brc_findrecord_in(brc_buf, brc_buf + brc_size, bid, &tnum); + *num = tnum; if ( ptr ){ memcpy(list, ptr + sizeof(brcbid_t) + sizeof(brcnbrd_t), *num * sizeof(time_t)); diff --git a/mbbsd/cache.c b/mbbsd/cache.c index 4756b359..d826199f 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -741,7 +741,7 @@ void buildBMcache(int bid) /* bid starts from 1 */ strncpy(s, bcache[bid].BM, sizeof(s)); for( i = 0 ; s[i] != 0 ; ++i ) - if( !isalpha(s[i]) && !isdigit(s[i]) ) + if( !isalpha((int)s[i]) && !isdigit((int)s[i]) ) s[i] = ' '; for( ptr = strtok(s, " "), i = 0 ; diff --git a/mbbsd/chat.c b/mbbsd/chat.c index b911b47c..caf3f1b8 100644 --- a/mbbsd/chat.c +++ b/mbbsd/chat.c @@ -268,7 +268,7 @@ const static chat_command_t chat_cmdtbl[] = { static int chat_cmd_match(char *buf, char *str) { - while (*str && *buf && !isspace(*buf)) + while (*str && *buf && !isspace((int)*buf)) if (tolower(*buf++) != *str++) return 0; return 1; diff --git a/mbbsd/chc.c b/mbbsd/chc.c index 759c9749..a0154e6c 100644 --- a/mbbsd/chc.c +++ b/mbbsd/chc.c @@ -306,7 +306,7 @@ chc_log_step(board_t board, rc_t *from, rc_t *to) } static int -#ifdef __linux__ +#if defined(__linux__) chc_filter(const struct dirent *dir) #else chc_filter(struct dirent *dir) @@ -902,7 +902,7 @@ chc_init(int s, chcusr_t *user1, chcusr_t *user2, board_t board, play_func_t pla chc_redraw(user1, user2, board); add_io(s, 0); - signal(SIGUSR1, chc_watch_request); + Signal(SIGUSR1, chc_watch_request); if (my->turn && !(chc_mode & CHC_WATCH)) chc_broadcast_recv(act_list, board); @@ -932,7 +932,7 @@ chc(int s, int mode) char mode0 = currutmp->mode; char file[80]; - signal(SIGUSR1, SIG_IGN); + Signal(SIGUSR1, SIG_IGN); chc_mode = mode; chc_bp = &board; @@ -969,7 +969,7 @@ chc(int s, int mode) } else chc_log_close(); - signal(SIGUSR1, talk_request); + Signal(SIGUSR1, talk_request); } static userinfo_t * @@ -1036,7 +1036,11 @@ chc_watch(void) vmsg("無法建立連線"); return -1; } +#if defined(Solaris) && __OS_MAJOR_VERSION__ == 5 && __OS_MINOR_VERSION__ < 7 + msgsock = accept(sock, (struct sockaddr *) 0, 0); +#else msgsock = accept(sock, (struct sockaddr *) 0, (socklen_t *) 0); +#endif close(sock); if (msgsock < 0) return -1; diff --git a/mbbsd/edit.c b/mbbsd/edit.c index aa08e7c7..088c7717 100644 --- a/mbbsd/edit.c +++ b/mbbsd/edit.c @@ -132,7 +132,7 @@ ansi2n(int ansix, textline_t * line) while (*tmp) { if (*tmp == KEY_ESC) { - while ((ch = *tmp) && !isalpha(ch)) + while ((ch = *tmp) && !isalpha((int)ch)) tmp++; if (ch) tmp++; @@ -158,7 +158,7 @@ n2ansi(int nx, textline_t * line) while (*tmp) { if (*tmp == KEY_ESC) { - while ((ch = *tmp) && !isalpha(ch)) + while ((ch = *tmp) && !isalpha((int)ch)) tmp++; if (ch) tmp++; @@ -992,7 +992,7 @@ addsignature(FILE * fp, int ifuseanony) if (!buf[0]) buf[0] = ch; - if (isdigit(buf[0])) + if (isdigit((int)buf[0])) ch = buf[0]; else ch = '1' + rand() % num; @@ -2012,7 +2012,7 @@ vedit(char *fpath, int saveheader, int *islocal) int fg, bg; strcpy(color, "\033["); - if (isdigit(*apos)) { + if (isdigit((int)*apos)) { sprintf(color,"%s%c", color, *(apos++)); if (*apos) strcat(color, ";"); @@ -2133,25 +2133,25 @@ vedit(char *fpath, int saveheader, int *islocal) break; case 'f': while (currpnt < currline->len && - isalnum(currline->data[++currpnt])); + isalnum((int)currline->data[++currpnt])); while (currpnt < currline->len && - isspace(currline->data[++currpnt])); + isspace((int)currline->data[++currpnt])); line_dirty = 1; break; case 'b': - while (currpnt && isalnum(currline->data[--currpnt])); - while (currpnt && isspace(currline->data[--currpnt])); + while (currpnt && isalnum((int)currline->data[--currpnt])); + while (currpnt && isspace((int)currline->data[--currpnt])); line_dirty = 1; break; case 'd': while (currpnt < currline->len) { delete_char(); - if (!isalnum(currline->data[currpnt])) + if (!isalnum((int)currline->data[currpnt])) break; } while (currpnt < currline->len) { delete_char(); - if (!isspace(currline->data[currpnt])) + if (!isspace((int)currline->data[currpnt])) break; } line_dirty = 1; @@ -636,7 +636,7 @@ oldgetdata(int line, int col, char *prompt, char *buf, int len, int echo) outc('\n'); refresh(); } - if ((echo == LCECHO) && isupper(buf[0])) + if ((echo == LCECHO) && isupper((int)buf[0])) buf[0] = tolower(buf[0]); return clen; } diff --git a/mbbsd/mail.c b/mbbsd/mail.c index 767bf5e2..94f936cd 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -1587,15 +1587,15 @@ doforward(char *direct, fileheader_t * fh, int mode) } else if (mode == 'U') { char tmp_buf[128]; - snprintf(fname, sizeof(fname), "/tmp/bbs.uu%05d", currpid); + snprintf(fname, sizeof(fname), "/tmp/bbs.uu%05d", (int)currpid); snprintf(tmp_buf, sizeof(tmp_buf), "/usr/bin/uuencode %s/%s uu.%05d > %s", - direct, fh->filename, currpid, fname); + direct, fh->filename, (int)currpid, fname); system(tmp_buf); } else if (mode == 'F') { char tmp_buf[128]; - snprintf(fname, sizeof(fname), "/tmp/bbs.f%05d", currpid); + snprintf(fname, sizeof(fname), "/tmp/bbs.f%05d", (int)currpid); snprintf(tmp_buf, sizeof(tmp_buf), "cp %s/%s %s", direct, fh->filename, fname); system(tmp_buf); diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c index eb935696..eb6ae50f 100644 --- a/mbbsd/mbbsd.c +++ b/mbbsd/mbbsd.c @@ -1007,17 +1007,17 @@ start_client() login_start_time = time(0); currmode = 0; - signal(SIGHUP, abort_bbs); - signal(SIGTERM, abort_bbs); - signal(SIGPIPE, abort_bbs); - - signal(SIGINT, abort_bbs_debug); - signal(SIGQUIT, abort_bbs_debug); - signal(SIGILL, abort_bbs_debug); - signal(SIGABRT, abort_bbs_debug); - signal(SIGFPE, abort_bbs_debug); - signal(SIGBUS, abort_bbs_debug); - signal(SIGSEGV, abort_bbs_debug); + Signal(SIGHUP, abort_bbs); + Signal(SIGTERM, abort_bbs); + Signal(SIGPIPE, abort_bbs); + + Signal(SIGINT, abort_bbs_debug); + Signal(SIGQUIT, abort_bbs_debug); + Signal(SIGILL, abort_bbs_debug); + Signal(SIGABRT, abort_bbs_debug); + Signal(SIGFPE, abort_bbs_debug); + Signal(SIGBUS, abort_bbs_debug); + Signal(SIGSEGV, abort_bbs_debug); signal_restart(SIGUSR1, talk_request); signal_restart(SIGUSR2, write_request); @@ -1029,7 +1029,7 @@ start_client() exit(1); do_term_init(); - signal(SIGALRM, abort_bbs); + Signal(SIGALRM, abort_bbs); alarm(600); login_query(); /* Ptt 加上login time out */ @@ -1042,7 +1042,7 @@ start_client() b_closepolls(); SHM->close_vote_time = now; } - signal(SIGALRM, SIG_IGN); + Signal(SIGALRM, SIG_IGN); domenu(MMENU, "主功\能表", (currutmp->mailalert ? 'M' : 'C'), cmdlist); } @@ -1122,7 +1122,7 @@ getremotename(struct sockaddr_in * from, char *rhost, char *rname) hp = NULL; if (setjmp(byebye) == 0) { - signal(SIGALRM, timeout); + Signal(SIGALRM, timeout); alarm(3); hp = gethostbyaddr((char *)&from->sin_addr, sizeof(struct in_addr), from->sin_family); @@ -1153,7 +1153,7 @@ getremotename(struct sockaddr_in * from, char *rhost, char *rname) } /* Set up a timer so we won't get stuck while waiting for the server. */ if (setjmp(byebye) == 0) { - signal(SIGALRM, timeout); + Signal(SIGALRM, timeout); alarm(RFC931_TIMEOUT); /* @@ -1251,11 +1251,11 @@ main(int argc, char *argv[], char *envp[]) start_time = time(NULL); /* avoid SIGPIPE */ - signal(SIGPIPE, SIG_IGN); + Signal(SIGPIPE, SIG_IGN); /* avoid erroneous signal from other mbbsd */ - signal(SIGUSR1, SIG_IGN); - signal(SIGUSR2, SIG_IGN); + Signal(SIGUSR1, SIG_IGN); + Signal(SIGUSR2, SIG_IGN); attach_SHM(); if( (argc == 3 && shell_login(argc, argv, envp)) || @@ -1362,17 +1362,22 @@ daemon_login(int argc, char *argv[], char *envp[]) #endif #endif - snprintf(buf, sizeof(buf), "run/mbbsd.%d.%d.pid", listen_port, getpid()); + snprintf(buf, sizeof(buf), "run/mbbsd.%d.%d.pid", listen_port, (int)getpid()); if ((fp = fopen(buf, "w"))) { - fprintf(fp, "%d\n", getpid()); + fprintf(fp, "%d\n", (int)getpid()); fclose(fp); } /* main loop */ while( 1 ){ len_of_sock_addr = sizeof(xsin); +#if defined(Solaris) && __OS_MAJOR_VERSION__ == 5 && __OS_MINOR_VERSION__ < 7 + if( (csock = accept(msock, (struct sockaddr *)&xsin, + &len_of_sock_addr)) < 0 ){ +#else if( (csock = accept(msock, (struct sockaddr *)&xsin, (socklen_t *)&len_of_sock_addr)) < 0 ){ +#endif if (errno != EINTR) sleep(1); continue; diff --git a/mbbsd/name.c b/mbbsd/name.c index 6ee8849f..db96eb08 100644 --- a/mbbsd/name.c +++ b/mbbsd/name.c @@ -449,7 +449,7 @@ usercomplete(char *prompt, char *data) outc(' '); move(y, x); continue; - } else if (count < STRLEN && isprint(ch)) { + } else if (count < STRLEN && isprint((int)ch)) { int n; *temp++ = ch; diff --git a/mbbsd/osdep.c b/mbbsd/osdep.c index 7b3fac06..b04a396a 100644 --- a/mbbsd/osdep.c +++ b/mbbsd/osdep.c @@ -1,7 +1,8 @@ /* $Id$ */ #include "bbs.h" -#ifdef __linux__ +#ifdef NEED_STRLCAT + #include <sys/types.h> #include <string.h> @@ -44,35 +45,39 @@ */ size_t strlcat(dst, src, siz) - char *dst; - const char *src; - size_t siz; + char *dst; + const char *src; + size_t siz; { - char *d = dst; - const char *s = src; - size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - while (n-- != 0 && *d != '\0') - d++; - dlen = d - dst; - n = siz - dlen; - - if (n == 0) - return(dlen + strlen(s)); - while (*s != '\0') { - if (n != 1) { - *d++ = *s; - n--; - } - s++; + char *d = dst; + const char *s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while (n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if (n == 0) + return(dlen + strlen(s)); + while (*s != '\0') { + if (n != 1) { + *d++ = *s; + n--; } - *d = '\0'; + s++; + } + *d = '\0'; - return(dlen + (s - src)); /* count does not include NUL */ + return(dlen + (s - src)); /* count does not include NUL */ } +#endif + +#ifdef NEED_STRLCPY + /* ------------------------------------------------------------------------ */ /* size_t @@ -112,33 +117,37 @@ strlcat(dst, src, siz) * Returns strlen(src); if retval >= siz, truncation occurred. */ size_t strlcpy(dst, src, siz) - char *dst; - const char *src; - size_t siz; + char *dst; + const char *src; + size_t siz; { - char *d = dst; - const char *s = src; - size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) { - do { - if ((*d++ = *s++) == 0) - break; - } while (--n != 0); - } + char *d = dst; + const char *s = src; + size_t n = siz; - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } - return(s - src - 1); /* count does not include NUL */ + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ } +#endif + +#ifdef NEED_STRCASESTR + char * strcasestr(const char *big, const char *little) { @@ -156,24 +165,299 @@ strcasestr(const char *big, const char *little) #endif -#if __FreeBSD__ +#ifdef NEED_SCANDIR + +/* + * Scan the directory dirname calling select to make a list of selected + * directory entries then sort using qsort and compare routine dcomp. + * Returns the number of entries and a pointer to a list of pointers to + * struct dirent (through namelist). Returns -1 if there were any errors. + */ + +<<<<<<< .working +======= +#include <sys/types.h> +#include <sys/stat.h> +#include <dirent.h> +#include <stdlib.h> +#include <string.h> -#include <kvm.h> +/* + * The DIRSIZ macro is the minimum record length which will hold the directory + * entry. This requires the amount of space in struct dirent without the + * d_name field, plus enough space for the name and a terminating nul byte + * (dp->d_namlen + 1), rounded up to a 4 byte boundary. + */ +#undef DIRSIZ +#define DIRSIZ(dp) \ + ((sizeof(struct dirent) - sizeof(dp)->d_name) + \ + ((strlen((dp)->d_name) + 1 + 3) &~ 3)) +#if 0 +((sizeof(struct dirent) - sizeof(dp)->d_name) + \ + (((dp)->d_namlen + 1 + 3) &~ 3)) +#endif int -cpuload(char *str) +scandir(dirname, namelist, select, dcomp) + const char *dirname; + struct dirent ***namelist; + int (*select) (struct dirent *); + int (*dcomp) (const void *, const void *); { - double l[3] = {-1, -1, -1}; - if (getloadavg(l, 3) != 3) - l[0] = -1; + register struct dirent *d, *p, **names; + register size_t nitems; + struct stat stb; + long arraysz; + DIR *dirp; - if (str) { - if (l[0] != -1) - sprintf(str, " %.2f %.2f %.2f", l[0], l[1], l[2]); - else - strcpy(str, " (unknown) "); + if ((dirp = opendir(dirname)) == NULL) + return(-1); + if (fstat(dirp->dd_fd, &stb) < 0) + return(-1); + + /* + * estimate the array size by taking the size of thedirectory file + * and dividing it by a multiple of the minimum sizeentry. + */ + arraysz = (stb.st_size / 24); + names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *)); + if (names == NULL) + return(-1); + + nitems = 0; + while ((d = readdir(dirp)) != NULL) { + if (select != NULL && !(*select)(d)) + continue; /* just selected names */ + /* + * Make a minimum size copy of the data + */ + p = (struct dirent *)malloc(DIRSIZ(d)); + if (p == NULL) + return(-1); + p->d_ino = d->d_ino; + p->d_off = d->d_off; + p->d_reclen = d->d_reclen; + memcpy(p->d_name, d->d_name, strlen(d->d_name) +1); +#if 0 + p->d_fileno = d->d_fileno; + p->d_type = d->d_type; + p->d_reclen = d->d_reclen; + p->d_namlen = d->d_namlen; + bcopy(d->d_name, p->d_name, p->d_namlen + 1); +#endif + /* + * Check to make sure the array has space left and + * realloc the maximum size. + */ + if (++nitems >= arraysz) { + if (fstat(dirp->dd_fd, &stb) < 0) + return(-1); /* just might have grown */ + arraysz = stb.st_size / 12; + names = (struct dirent **)realloc((char*)names, + arraysz * sizeof(struct dirent*)); + if (names == NULL) + return(-1); + } + names[nitems-1] = p; } - return (int)l[0]; + closedir(dirp); + if (nitems && dcomp != NULL) + qsort(names, nitems, sizeof(struct dirent *),dcomp); + *namelist = names; + return(nitems); +} + +/* + * Alphabetic order comparison routine for those who want it. + */ +int +alphasort(d1, d2) + const void *d1; + const void *d2; +{ + return(strcmp((*(struct dirent **)d1)->d_name, + (*(struct dirent **)d2)->d_name)); +} + +#endif + +#ifdef NEED_FLOCK + +int +flock (int fd, int f) +{ + if( f == LOCK_EX ) + return lockf(fd, F_LOCK, 0L); + + if( f == LOCK_UN ) + return lockf(fd, F_ULOCK, 0L); + + return -1; +} + +#endif + +#ifdef NEED_UNSETENV + +void +unsetenv(name) + char *name; +{ + extern char **environ; + register char **pp; + int len = strlen(name); + + for (pp = environ; *pp != NULL; pp++) + { + if (strncmp(name, *pp, len) == 0 && + ((*pp)[len] == '=' || (*pp)[len] == '\0')) + break; + } + + for (; *pp != NULL; pp++) + *pp = pp[1]; +} + +#endif + +#ifdef NEED_INET_PTON + +#include <arpa/nameser.h> + +/* + * Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +int +inet_pton(int af, const char *src, void *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + u_char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + u_int new = *tp * 10 + (pch - digits); + + if (new > 255) + return (0); + *tp = new; + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + + memcpy(dst, tmp, INADDRSZ); + + return (1); +} +#endif + +#ifdef NEED_BSD_SIGNAL + +void (*bsd_signal(int sig, void (*func)(int)))(int) +{ + struct sigaction act, oact; + + act.sa_handler = func; + act.sa_flags = SA_RESTART; + sigemptyset(&act.sa_mask); + sigaddset(&act.sa_mask, sig); + if (sigaction(sig, &act, &oact) == -1) + return(SIG_ERR); + return(oact.sa_handler); +} + + +#endif + + +#ifdef Solaris + +#include <sys/stat.h> +#include <sys/swap.h> + + +double swapused(int *total, int *used) +{ + double percent = -1; + register int cnt, i; + register int free; + struct swaptable *swt; + struct swapent *ste; + static char path[256]; + cnt = swapctl(SC_GETNSWP, 0); + swt = (struct swaptable *)malloc(sizeof(int) + + cnt * sizeof(struct swapent)); + if (swt == NULL) + { + return 0; + } + swt->swt_n = cnt; + + /* fill in ste_path pointers: we don't care about the paths, so we point + them all to the same buffer */ + ste = &(swt->swt_ent[0]); + i = cnt; + while (--i >= 0) + { + ste++->ste_path = path; + } + /* grab all swap info */ + swapctl(SC_LIST, swt); + + /* walk thru the structs and sum up the fields */ + *total = free = 0; + ste = &(swt->swt_ent[0]); + i = cnt; + while (--i >= 0) + { + /* dont count slots being deleted */ + if (!(ste->ste_flags & ST_INDEL) && + !(ste->ste_flags & ST_DOINGDEL)) + { + *total += ste->ste_pages; + free += ste->ste_free; + } + ste++; + } + + *used = *total - free; + if( total != 0) + percent = (double)*used / (double)*total; + else + percent = 0; + + return percent; } double @@ -198,7 +482,90 @@ swapused(int *total, int *used) return percent; } -#else +#endif + +#if __FreeBSD__ + +int +cpuload(char *str) +{ + double l[3] = {-1, -1, -1}; + if (getloadavg(l, 3) != 3) + l[0] = -1; + + if (str) { + if (l[0] != -1) + sprintf(str, " %.2f %.2f %.2f", l[0], l[1], l[2]); + else + strcpy(str, " (unknown) "); + } + return (int)l[0]; +} +#endif + + +#ifdef Solaris + +#include <kstat.h> +#include <sys/param.h> + +#define loaddouble(la) ((double)(la) / FSCALE) + +int +cpuload(char *str) +{ + kstat_ctl_t *kc; + kstat_t *ks; + kstat_named_t *kn; + double l[3] = {-1, -1, -1}; + + kc = kstat_open(); + + if( !kc ){ + strcpy(str, "(unknown) "); + return -1; + } + + ks = kstat_lookup( kc, "unix", 0, "system_misc"); + + if( kstat_read( kc, ks, 0) == -1){ + strcpy( str, "( unknown "); + return -1; + } + + kn = kstat_data_lookup( ks, "avenrun_1min" ); + + if( kn ) { + l[0] = loaddouble(kn->value.ui32); + } + + kn = kstat_data_lookup( ks, "avenrun_5min" ); + + if( kn ) { + l[1] = loaddouble(kn->value.ui32); + } + + kn = kstat_data_lookup( ks, "avenrun_15min" ); + + if( kn ) { + l[2] = loaddouble(kn->value.ui32); + } + + if (str) { + + if (l[0] != -1) + sprintf(str, " %.2f %.2f %.2f", l[0], l[1], l[2]); + else + strcpy(str, " (unknown) "); + } + + kstat_close(kc); + return (int)l[0]; +} + +#endif + +#ifdef __linux__ int cpuload(char *str) { diff --git a/mbbsd/talk.c b/mbbsd/talk.c index eb51d4f4..5d69f85e 100644 --- a/mbbsd/talk.c +++ b/mbbsd/talk.c @@ -1259,7 +1259,11 @@ int make_connection_to_somebody(userinfo_t *uin, int timeout){ return -1; } length = sizeof(server); +#if defined(Solaris) && __OS_MAJOR_VERSION__ == 5 && __OS_MINOR_VERSION__ < 7 + if (getsockname(sock, (struct sockaddr *) & server, & length) < 0) { +#else if (getsockname(sock, (struct sockaddr *) & server, (socklen_t *) & length) < 0) { +#endif close(sock); perror("sock name err"); unlockutmpmode(); @@ -1426,7 +1430,11 @@ my_talk(userinfo_t * uin, int fri_stat, char defact) sock = make_connection_to_somebody(uin, 5); +#if defined(Solaris) && __OS_MAJOR_VERSION__ == 5 && __OS_MINOR_VERSION__ < 7 + msgsock = accept(sock, (struct sockaddr *) 0, 0); +#else msgsock = accept(sock, (struct sockaddr *) 0, (socklen_t *) 0); +#endif if (msgsock == -1) { perror("accept"); unlockutmpmode(); diff --git a/mbbsd/term.c b/mbbsd/term.c index 555840d1..9d766fe4 100644 --- a/mbbsd/term.c +++ b/mbbsd/term.c @@ -58,7 +58,7 @@ term_resize(int sig) struct winsize newsize; screenline_t *new_picture; - signal(SIGWINCH, SIG_IGN); /* Don't bother me! */ + Signal(SIGWINCH, SIG_IGN); /* Don't bother me! */ ioctl(0, TIOCGWINSZ, &newsize); /* make sure reasonable size */ @@ -82,13 +82,13 @@ term_resize(int sig) b_lines = t_lines - 1; p_lines = t_lines - 4; - signal(SIGWINCH, term_resize); + Signal(SIGWINCH, term_resize); } int term_init() { - signal(SIGWINCH, term_resize); + Signal(SIGWINCH, term_resize); return YEA; } diff --git a/mbbsd/topsong.c b/mbbsd/topsong.c index 073f0138..07931aa0 100644 --- a/mbbsd/topsong.c +++ b/mbbsd/topsong.c @@ -55,7 +55,7 @@ sortsong() while (fgets(buf, 200, fp)) { strtok(buf, "\n\r"); strip_blank(cbuf, buf); - if (!cbuf[0] || !isprint2(cbuf[0])) + if (!cbuf[0] || !isprint2((int)cbuf[0])) continue; for (n = 0; n < MAX_SONGS && songs[n].name[0]; n++) diff --git a/mbbsd/user.c b/mbbsd/user.c index 5ce60d71..eb93217e 100644 --- a/mbbsd/user.c +++ b/mbbsd/user.c @@ -911,7 +911,7 @@ ispersonalid(char *inid) strlcpy(id, inid, sizeof(id)); i = cksum = 0; - if (!isalpha(id[0]) && (strlen(id) != 10)) + if (!isalpha((int)id[0]) && (strlen(id) != 10)) return 0; if (!(id[1] == '1' || id[1] == '2')) return 0; @@ -927,12 +927,12 @@ ispersonalid(char *inid) i++; i += 10; id[0] = i % 10 + '0'; - if (!isdigit(id[9])) + if (!isdigit((int)id[9])) return 0; cksum += (id[9] - '0') + (i / 10); for (j = 0; j < 9; ++j) { - if (!isdigit(id[j])) + if (!isdigit((int)id[j])) return 0; cksum += (id[j] - '0') * (9 - j); } @@ -1196,7 +1196,7 @@ static char *isvalidphone(char *phone) { int i; for( i = 0 ; phone[i] != 0 ; ++i ) - if( !isdigit(phone[i]) ) + if( !isdigit((int)phone[i]) ) return "請不要加分隔符號"; if (!removespace(phone) || strlen(phone) < 9 || |