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

📄 misc_new.c

📁 基于minigui的浏览器. 这是最新版本.
💻 C
字号:
#include <stdio.h>#include <time.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/stat.h>#include <sys/types.h>#include <errno.h>#include <fcntl.h>#include <glib.h>#include "dpid_common.h"#include "misc_new.h"  /* for function prototypes *//* define to 1 when checking for memory leaks * \todo * Eliminate need for a_Misc_get_home and a_Misc_get_user when testing for * memory leaks by using ld --wrap option to replace g_get_home_dir and * g_get_user_name with wrapper functions. */#ifndef TEST#define TEST 0#endif/* * Close a FD handling EINTR. */gint a_Misc_close_fd(gint fd){   gint st;   do {      st = close(fd);   } while (st < 0 && errno == EINTR);   return st;}/* * Return the user's home directory. * Don't free the returned string! */gchar *a_Misc_get_home(void){   gchar *ret;   ret = (TEST) ? getenv("HOME") : g_get_home_dir();   return ret;}/* * Return the user. * Don't free the returned string! */gchar *a_Misc_get_user(void){   gchar *ret;   ret = (TEST) ? getenv("USER") : g_get_user_name();   return ret;}/* * Prepend the users home-dir to 'file' string i.e, * pass in .dillo/bookmarks.html and it will return * /home/imain/.dillo/bookmarks.html * * Remember to g_free() returned value! * copied from misc.c */gchar *a_Misc_prepend_user_home(const char *file){   return (g_strconcat(a_Misc_get_home(), "/", file, NULL));}/* * Read a line of text up to the newline character, store it into a newly * allocated string and return it. * (copied from dpi/bm_srv12.c) */char *a_Misc_get_line(FILE *stream){   guint i, size = 64;   int ch;   char *buf;   buf = g_new(char, size);   for (i = 0; (ch = fgetc(stream)) != EOF; ++i) {      if (i + 1 == size) {         size *= 2;         buf = g_realloc(buf, size);      }      if ((buf[i] = ch) == '\n' && ++i)         break;   }   buf[i] = 0;   if (i > 0) {      buf = g_realloc(buf, i + 1);   } else {      g_free(buf);      buf = NULL;   }   return buf;}/*! Reads a dpi tag from a socket * \li Continues after a signal interrupt * \Return * Gstring pointer to tag on success, NULL on failure * \important Caller is responsible for freeing the returned GString * */GString *a_Misc_rdtag(int socket){   char c = '\0';   ssize_t rdlen;   GString *tag;   tag = g_string_new(NULL);   errno = 0;   do {      rdlen = read(socket, &c, 1);      if (rdlen == -1 && errno != EINTR)         break;      g_string_append_c(tag, c);   } while (c != '>');   if (rdlen == -1) {      perror("a_Misc_rdtag");      g_string_free(tag, TRUE);      return (NULL);   }   return (tag);}/*! * Read a dpi tag from sock * \return * pointer to dynamically allocated request tag */char *a_Misc_readtag(int sock){   char *tag, c, buf[10];   size_t buflen, i;   size_t taglen = 0, tagmem = 10;   ssize_t rdln = 1;   tag = NULL;   buf[0] = '\0';   buflen = sizeof(buf) / sizeof(buf[0]);   /* new start */   tag = (char *) g_malloc(tagmem + 1);   for (i = 0; (rdln = read(sock, &c, 1)) != 0; i++) {      if (i == tagmem) {         tagmem += tagmem;         tag = (char *) g_realloc(tag, tagmem + 1);      }      tag[i] = c;      taglen += rdln;      if (c == '>') {         tag[i + 1] = '\0';         break;      }   }   /* new end */   if (rdln == -1) {      ERRMSG("a_Misc_readtag", "read", errno);   }   return (tag);}/*! Reads a dpi tag from a socket without hanging on read. * \li Continues after a signal interrupt * \Return * \li 1 on success * \li 0 if input is not available within timeout microseconds. * \li -1 on failure * \important Caller is responsible for freeing the returned GString * *//* Is this useful?int a_Misc_nohang_rdtag(int socket, int timeout, GString **tag){   int n_fd;   fd_set sock_set, select_set;   struct timeval tout;   FD_ZERO(&sock_set);   FD_SET(socket, &sock_set);   errno = 0;   do {      select_set = sock_set;      tout.tv_sec = 0;      tout.tv_usec = timeout;      n_fd = select(socket + 1, &select_set, NULL, NULL, &tout);   } while (n_fd == -1 && errno == EINTR);   if (n_fd == -1) {      fprintf(stderr, "%s:%d: a_Misc_nohang_rdtag: %s\n",              __FILE__, __LINE__, g_strerror(errno));      return(-1);   }   if (n_fd == 0) {      return(0);   } else {      *tag = a_Misc_rdtag(socket);      return(1);   }}*//* * Alternative to mkdtemp(). * Not as strong as mkdtemp, but enough for creating a directory. * (adapted from dietlibc) */char *a_Misc_mkdtemp(char *template){   char *tmp = template + strlen(template) - 6;   int i;   unsigned int random;   if (tmp < template)      goto error;   for (i = 0; i < 6; ++i)      if (tmp[i] != 'X') {       error:         errno = EINVAL;         return 0;      }   srand((guint)(time(0) ^ getpid()));   for (;;) {      random = (unsigned) rand();      for (i = 0; i < 6; ++i) {         int hexdigit = (random >> (i * 5)) & 0x1f;         tmp[i] = hexdigit > 9 ? hexdigit + 'a' - 10 : hexdigit + '0';      }      if (mkdir(template, 0700) == 0)         break;      if (errno == EEXIST)         continue;      return 0;   }   return template;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -