📄 sysutil.c
字号:
{ die("fcntl"); }}voidvsf_sysutil_activate_oobinline(int fd){ int oob_inline = 1; int retval = setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &oob_inline, sizeof(oob_inline)); if (retval != 0) { die("setsockopt: oobinline"); }}voidvsf_sysutil_set_iptos_throughput(int fd){ int tos = IPTOS_THROUGHPUT; /* Ignore failure to set (maybe this IP stack demands privilege for this) */ (void) setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));}voidvsf_sysutil_activate_linger(int fd){ int retval; struct linger the_linger; vsf_sysutil_memclr(&the_linger, sizeof(the_linger)); the_linger.l_onoff = 1; the_linger.l_linger = 32767; retval = setsockopt(fd, SOL_SOCKET, SO_LINGER, &the_linger, sizeof(the_linger)); if (retval != 0) { die("setsockopt: linger"); }}voidvsf_sysutil_deactivate_linger_failok(int fd){ struct linger the_linger; the_linger.l_onoff = 0; the_linger.l_linger = 0; (void) setsockopt(fd, SOL_SOCKET, SO_LINGER, &the_linger, sizeof(the_linger));}voidvsf_sysutil_activate_noblock(int fd){ int retval; int curr_flags = fcntl(fd, F_GETFL); if (vsf_sysutil_retval_is_error(curr_flags)) { die("fcntl"); } curr_flags |= O_NONBLOCK; retval = fcntl(fd, F_SETFL, curr_flags); if (retval != 0) { die("fcntl"); }}voidvsf_sysutil_deactivate_noblock(int fd){ int retval; int curr_flags = fcntl(fd, F_GETFL); if (vsf_sysutil_retval_is_error(curr_flags)) { die("fcntl"); } curr_flags &= ~O_NONBLOCK; retval = fcntl(fd, F_SETFL, curr_flags); if (retval != 0) { die("fcntl"); }}intvsf_sysutil_recv_peek(const int fd, void* p_buf, unsigned int len){ while (1) { int retval = recv(fd, p_buf, len, MSG_PEEK); int saved_errno = errno; vsf_sysutil_check_pending_actions(kVSFSysUtilIO, retval, fd); if (retval < 0 && saved_errno == EINTR) { continue; } return retval; }}intvsf_sysutil_atoi(const char* p_str){ return atoi(p_str);}filesize_tvsf_sysutil_a_to_filesize_t(const char* p_str){ /* atoll() is C99 standard - but even modern FreeBSD, OpenBSD don't have * it, so we'll supply our own */ filesize_t result = 0; filesize_t mult = 1; unsigned int len = vsf_sysutil_strlen(p_str); unsigned int i; /* Bail if the number is excessively big (petabytes!) */ if (len > 15) { return 0; } for (i=0; i<len; ++i) { char the_char = p_str[len-(i+1)]; filesize_t val; if (the_char < '0' || the_char > '9') { return 0; } val = the_char - '0'; val *= mult; result += val; mult *= 10; } return result;}const char*vsf_sysutil_ulong_to_str(unsigned long the_ulong){ static char ulong_buf[32]; (void) snprintf(ulong_buf, sizeof(ulong_buf), "%lu", the_ulong); return ulong_buf;}const char*vsf_sysutil_filesize_t_to_str(filesize_t the_filesize){ static char filesize_buf[32]; if (sizeof(long) == 8) { /* Avoid using non-standard %ll if we can */ (void) snprintf(filesize_buf, sizeof(filesize_buf), "%ld", (long) the_filesize); } else { (void) snprintf(filesize_buf, sizeof(filesize_buf), "%lld", the_filesize); } return filesize_buf;}const char*vsf_sysutil_double_to_str(double the_double){ static char double_buf[32]; (void) snprintf(double_buf, sizeof(double_buf), "%.2f", the_double); return double_buf;}const char*vsf_sysutil_uint_to_octal(unsigned int the_uint){ static char octal_buf[32]; if (the_uint == 0) { octal_buf[0] = '0'; octal_buf[1] = '\0'; } else { (void) snprintf(octal_buf, sizeof(octal_buf), "0%o", the_uint); } return octal_buf;}unsigned intvsf_sysutil_octal_to_uint(const char* p_str){ /* NOTE - avoiding using sscanf() parser */ unsigned int result = 0; int seen_non_zero_digit = 0; while (*p_str != '\0') { int digit = *p_str; if (!isdigit(digit) || digit > '7') { break; } if (digit != '0') { seen_non_zero_digit = 1; } if (seen_non_zero_digit) { result <<= 3; result += (digit - '0'); } p_str++; } return result;}intvsf_sysutil_toupper(int the_char){ return toupper(the_char);}intvsf_sysutil_isspace(int the_char){ return isspace(the_char);}intvsf_sysutil_isprint(int the_char){ /* From Solar - we know better than some libc's! Don't let any potential * control chars through */ unsigned char uc = (unsigned char) the_char; if (uc <= 31) { return 0; } if (uc == 177) { return 0; } if (uc >= 128 && uc <= 159) { return 0; } return isprint(the_char);}intvsf_sysutil_isalnum(int the_char){ return isalnum(the_char);}intvsf_sysutil_isdigit(int the_char){ return isdigit(the_char);}char*vsf_sysutil_getcwd(char* p_dest, const unsigned int buf_size){ char* p_retval; if (buf_size == 0) { return p_dest; } p_retval = getcwd(p_dest, buf_size); p_dest[buf_size - 1] = '\0'; return p_retval;}intvsf_sysutil_mkdir(const char* p_dirname, const unsigned int mode){ return mkdir(p_dirname, mode);}intvsf_sysutil_rmdir(const char* p_dirname){ return rmdir(p_dirname);}intvsf_sysutil_chdir(const char* p_dirname){ return chdir(p_dirname);}intvsf_sysutil_rename(const char* p_from, const char* p_to){ return rename(p_from, p_to);}struct vsf_sysutil_dir*vsf_sysutil_opendir(const char* p_dirname){ return (struct vsf_sysutil_dir*) opendir(p_dirname);}voidvsf_sysutil_closedir(struct vsf_sysutil_dir* p_dir){ DIR* p_real_dir = (DIR*) p_dir; int retval = closedir(p_real_dir); if (retval != 0) { die("closedir"); }}const char*vsf_sysutil_next_dirent(struct vsf_sysutil_dir* p_dir){ DIR* p_real_dir = (DIR*) p_dir; struct dirent* p_dirent = readdir(p_real_dir); if (p_dirent == NULL) { return NULL; } return p_dirent->d_name;}unsigned intvsf_sysutil_strlen(const char* p_text){ unsigned int ret = strlen(p_text); /* A defense in depth measure. */ if (ret > INT_MAX / 8) { die("string suspiciously long"); } return ret;}char*vsf_sysutil_strdup(const char* p_str){ return strdup(p_str);}voidvsf_sysutil_memclr(void* p_dest, unsigned int size){ /* Safety */ if (size == 0) { return; } memset(p_dest, '\0', size);}voidvsf_sysutil_memcpy(void* p_dest, const void* p_src, const unsigned int size){ /* Safety */ if (size == 0) { return; } /* Defense in depth */ if (size > INT_MAX) { die("possible negative value to memcpy?"); } memcpy(p_dest, p_src, size);}voidvsf_sysutil_strcpy(char* p_dest, const char* p_src, unsigned int maxsize){ if (maxsize == 0) { return; } strncpy(p_dest, p_src, maxsize); p_dest[maxsize - 1] = '\0';}intvsf_sysutil_memcmp(const void* p_src1, const void* p_src2, unsigned int size){ /* Safety */ if (size == 0) { return 0; } return memcmp(p_src1, p_src2, size);}intvsf_sysutil_strcmp(const char* p_src1, const char* p_src2){ return strcmp(p_src1, p_src2);}unsigned intvsf_sysutil_getpagesize(void){ static unsigned int s_page_size; if (s_page_size == 0) { s_page_size = getpagesize(); if (s_page_size == 0) { die("getpagesize"); } } return s_page_size;}static intvsf_sysutil_translate_memprot(const enum EVSFSysUtilMapPermission perm){ int retval = 0; switch (perm) { case kVSFSysUtilMapProtReadOnly: retval = PROT_READ; break; case kVSFSysUtilMapProtNone: retval = PROT_NONE; break; default: bug("bad value in vsf_sysutil_translate_memprot"); break; } return retval;}voidvsf_sysutil_memprotect(void* p_addr, unsigned int len, const enum EVSFSysUtilMapPermission perm){ int prot = vsf_sysutil_translate_memprot(perm); int retval = mprotect(p_addr, len, prot); if (retval != 0) { die("mprotect"); }}voidvsf_sysutil_memunmap(void* p_start, unsigned int length){ int retval = munmap(p_start, length); if (retval != 0) { die("munmap"); }}static intvsf_sysutil_translate_openmode(const enum EVSFSysUtilOpenMode mode){ int retval = 0; switch (mode) { case kVSFSysUtilOpenReadOnly: retval = O_RDONLY; break; case kVSFSysUtilOpenWriteOnly: retval = O_WRONLY; break; case kVSFSysUtilOpenReadWrite: retval = O_RDWR; break; default: bug("bad mode in vsf_sysutil_translate_openmode"); break; } return retval;}intvsf_sysutil_open_file(const char* p_filename, const enum EVSFSysUtilOpenMode mode){ return open(p_filename, vsf_sysutil_translate_openmode(mode) | O_NONBLOCK);}intvsf_sysutil_create_file(const char* p_filename){ /* umask() also contributes to end mode */ return open(p_filename, O_CREAT | O_EXCL | O_WRONLY | O_APPEND, tunable_file_open_mode);}intvsf_sysutil_create_overwrite_file(const char* p_filename){ return open(p_filename, O_CREAT | O_TRUNC | O_WRONLY | O_APPEND | O_NONBLOCK, tunable_file_open_mode);}intvsf_sysutil_create_or_open_file(const char* p_filename, unsigned int mode){ return open(p_filename, O_CREAT | O_WRONLY | O_APPEND | O_NONBLOCK, mode);}voidvsf_sysutil_dupfd2(int old_fd, int new_fd){ int retval; if (old_fd == new_fd) { return; } retval = dup2(old_fd, new_fd); if (retval != new_fd) { die("dup2"); }}voidvsf_sysutil_close(int fd){ while (1) { int retval = close(fd); if (retval != 0) { if (errno == EINTR) { vsf_sysutil_check_pending_actions(kVSFSysUtilUnknown, 0, 0); continue; } die("close"); } return; }}intvsf_sysutil_close_failok(int fd){ return close(fd);}intvsf_sysutil_unlink(const char* p_dead){ return unlink(p_dead);}intvsf_sysutil_write_access(const char* p_filename){ int retval = access(p_filename, W_OK); return (retval == 0);}static voidvsf_sysutil_alloc_statbuf(struct vsf_sysutil_statbuf** p_ptr){ if (*p_ptr == NULL) { *p_ptr = vsf_sysutil_malloc(sizeof(struct stat)); }}voidvsf_sysutil_fstat(int fd, struct vsf_sysutil_statbuf** p_ptr){ int retval; vsf_sysutil_alloc_statbuf(p_ptr); retval = fstat(fd, (struct stat*) (*p_ptr)); if (retval != 0) { die("fstat"); }}intvsf_sysutil_stat(const char* p_name, struct vsf_sysutil_statbuf** p_ptr){ vsf_sysutil_alloc_statbuf(p_ptr); return stat(p_name, (struct stat*) (*p_ptr));}intvsf_sysutil_lstat(const char* p_name, struct vsf_sysutil_statbuf** p_ptr){ vsf_sysutil_alloc_statbuf(p_ptr); return lstat(p_name, (struct stat*) (*p_ptr));}voidvsf_sysutil_dir_stat(const struct vsf_sysutil_dir* p_dir, struct vsf_sysutil_statbuf** p_ptr){ int fd = dirfd((DIR*) p_dir); vsf_sysutil_fstat(fd, p_ptr);}intvsf_sysutil_statbuf_is_regfile(const struct vsf_sysutil_statbuf* p_stat){ const struct stat* p_realstat = (const struct stat*) p_stat; return S_ISREG(p_realstat->st_mode);}intvsf_sysutil_statbuf_is_symlink(const struct vsf_sysutil_statbuf* p_stat){ const struct stat* p_realstat = (const struct stat*) p_stat; return S_ISLNK(p_realstat->st_mode);}intvsf_sysutil_statbuf_is_socket(const struct vsf_sysutil_statbuf* p_stat){ const struct stat* p_realstat = (const struct stat*) p_stat; return S_ISSOCK(p_realstat->st_mode);}intvsf_sysutil_statbuf_is_dir(const struct vsf_sysutil_statbuf* p_stat){ const struct stat* p_realstat = (const struct stat*) p_stat; return S_ISDIR(p_realstat->st_mode);}const char*vsf_sysutil_statbuf_get_perms(const struct vsf_sysutil_statbuf* p_statbuf){ static char perms[11]; int i; const struct stat* p_stat = (const struct stat*) p_statbuf; for (i=0; i<10; i++) { perms[i] = '-'; } perms[0] = '?'; switch (p_stat->st_mode & S_IFMT) { case S_IFREG: perms[0] = '-'; break; case S_IFDIR: perms[0] = 'd'; break; case S_IFLNK: perms[0] = 'l'; break; case S_IFIFO: perms[0] = 'p'; break; case S_IFSOCK: perms[0] = 's'; break; case S_IFCHR: perms[0] = 'c'; break; case S_IFBLK: perms[0] = 'b'; break; } if (p_stat->st_mode & S_IRUSR) perms[1] = 'r'; if (p_stat->st_mode & S_IWUSR) perms[2] = 'w'; if (p_stat->st_mode & S_IXUSR) perms[3] = 'x'; if (p_stat->st_mode & S_IRGRP) perms[4] = 'r'; if (p_stat->st_mode & S_IWGRP) perms[5] = 'w'; if (p_stat->st_mode & S_IXGRP) perms[6] = 'x'; if (p_stat->st_mode & S_IROTH) perms[7] = 'r'; if (p_stat->st_mode & S_IWOTH) perms[8] = 'w'; if (p_stat->st_mode & S_IXOTH) perms[9] = 'x'; if (p_stat->st_mode & S_ISUID) perms[3] = (perms[3] == 'x') ? 's' : 'S'; if (p_stat->st_mode & S_ISGID) perms[6] = (perms[6] == 'x') ? 's' : 'S'; if (p_stat->st_mode & S_ISVTX) perms[9] = (perms[9] == 'x') ? 't' : 'T'; perms[10] = '\0'; return perms;}const char*vsf_sysutil_statbuf_get_date(const struct vsf_sysutil_statbuf* p_statbuf, int use_localtime){ static char datebuf[64]; int retval; struct tm* p_tm; const struct stat* p_stat = (const struct stat*) p_statbuf; long local_time = vsf_sysutil_get_cached_time_sec(); const char* p_date_format = "%b %d %H:%M"; if (!use_localtime) { p_tm = gmtime(&p_stat->st_mtime); } else { p_tm = localtime(&p_stat->st_mtime); } /* Is this a future or 6 months old date? If so, we drop to year format */ if (p_stat->st_mtime > local_time || (local_time - p_stat->st_mtime) > 60*60*24*182) { p_date_format = "%b %d %Y"; } retval = strftime(datebuf, sizeof(datebuf), p_date_format, p_tm); datebuf[sizeof(datebuf)-1] = '\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -