⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysutil.c

📁 文件传输协议linux 下vsftpd2.1.0.tar.gz
💻 C
📖 第 1 页 / 共 4 页
字号:
  {    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 + -