亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mms_mmbox.c

?? 手機端彩信的編解碼、以及接收和發送。非常有用。
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Mbuni - Open  Source MMS Gateway 
 * 
 * Mbuni MMBox implementation
 * 
 * Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com
 *
 * Paul Bagyenda <bagyenda@dsmagic.com>
 * 
 * This program is free software, distributed under the terms of
 * the GNU General Public License, with a few exceptions granted (see LICENSE)
 */

#include <sys/file.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <ctype.h>

#include "mms_mmbox.h"
#include "mms_util.h"
#include "gwlib/log.h"
#include "gwlib/accesslog.h"

#define MAXTRIES 10
#define MDF 'd'
#define MTF 't'
#define IDXFILE "00Index"

#define ITEM_ADD 1
#define ITEM_DEL 2
#define ITEM_MOD 3



/* Initialise the root of the mmbox. Should be called once from load settings. */
int mmbox_root_init(char *mmbox_root)
{
     int i, ret;
     if ((ret = mkdir(mmbox_root, 
		      S_IRWXU|S_IRWXG)) < 0 && 
	 errno != EEXIST)
	  return errno;
     for (i = 0; _TT[i]; i++) {
	  char fbuf[256];

	  sprintf(fbuf, "%.128s/%c", mmbox_root, _TT[i]);	  
	  if (mkdir(fbuf, 
		    S_IRWXU|S_IRWXG) < 0 && 
	      errno != EEXIST)
	       return errno;
     }     
     srandom(time(NULL)); /* we need rands below...*/

     return 0;
}

/* Initialise the mmbox home of the user/msisdn.
 * structure of mmbox is: 
 * - index file [IDXFILE]
 * - directories a - z 0 - 9, which each can contain directories with two-character 
 *   names
 * on init we only create the directory itself. internal 
 * directory structure and index will be made by first message put in.
 * return user dir, or NULL if something went wrong.
 */
static Octstr *user_mmbox_dir(char *mmbox_root, char *userid)
{

     unsigned long h = _mshash(userid);
     char d1[2], d2[3], fbuf[512];
     Octstr *t, *s;

     /* Make toplevel dir. */
     d1[0] = _TT[h%_TTSIZE];
     d1[1] = '\0';
     
     /* Then lower level. */
     h /= _TTSIZE;
     d2[0] = _TT[h%_TTSIZE];
     h /= _TTSIZE;     
     d2[1] = _TT[h%_TTSIZE];
     d2[2] = '\0';
     
     /* Try and create the next level dir (first level was created by root_init) */
     sprintf(fbuf, "%.128s/%s/%s", mmbox_root, d1, d2);
     if (mkdir(fbuf, 
	       S_IRWXU|S_IRWXG) < 0 && 
	 errno != EEXIST) {
	  error(0, "mmbox: failed to create dir [%s] "
		"while initialising mmbox for %s: %s!",
		fbuf, userid, strerror(errno));
	  return NULL;
     }
     
     t = octstr_create(userid);
     octstr_replace(t, octstr_imm("/"), octstr_imm("$")); /* XXX safe in all cases?? */
     s  = octstr_format("%s/%S", fbuf, t);
     octstr_destroy(t);

     if (mkdir(octstr_get_cstr(s), 
	       S_IRWXU|S_IRWXG) < 0 && 
	 errno != EEXIST) {
	  error(0, "mmbox: failed to create dir [%s] "
		"while initialising mmbox for %s: %s!",
		octstr_get_cstr(s), userid, strerror(errno));
	  octstr_destroy(s);
	  return NULL;
     }
     return s;
}

/* Makes a file name in the nested directory structure, where we can store 
 * data. Makes a number of tries -- similar to mkqf in queue module. 
 */
static int mkdf(char df[64], char *mmbox_home)
{

     int i = 0, fd = -1;
     static int ect;
     
     if (!mmbox_home)
	  gw_panic(0, "Mmbox directory passed as null!");
     
     do {	 	  
	  char d1[2], d2[3];
	  Octstr *tmp;
	  char *ctmp;
	  
	  d1[0] = _TT[random() % _TTSIZE];
	  d1[1] = '\0';
	  
	  /* Make first level. */
	  tmp = octstr_format("%.128s/%s", mmbox_home, d1);	  
	  if (mkdir(octstr_get_cstr(tmp), 
		    S_IRWXU|S_IRWXG) < 0 && 
	      errno != EEXIST) {
	       error(0, "mmbox.mkdf: failed to create dir [%s] "
		     " in mmbox home %s: %s!",
		     octstr_get_cstr(tmp), mmbox_home, strerror(errno));
	       octstr_destroy(tmp);
	       return -1;
	  }

	  octstr_destroy(tmp);

	  d2[0] = _TT[random() % _TTSIZE];
	  d2[1] = _TT[random() % _TTSIZE];
	  d2[2] = '\0';

	  /* Make second level. */
	  tmp = octstr_format("%.128s/%s/%s", mmbox_home, d1,d2);
	  
	  if (mkdir(octstr_get_cstr(tmp), 
		    S_IRWXU|S_IRWXG) < 0 && 
	      errno != EEXIST) {
	       error(0, "mmbox.mkdf: failed to create dir [%s] "
		     " in mmbox home %s: %s!",
		     octstr_get_cstr(tmp), mmbox_home, strerror(errno));
	       octstr_destroy(tmp);
	       return -1;
	  }
	  octstr_destroy(tmp);
	  
	  /* use df[] to store candidate so when we hit success it is already there...*/
	  sprintf(df, "%s/%s/%cf%ld.%d.x%d%ld", 
			      d1,d2, MDF, 
			      time(NULL), 
			      ++ect, getpid(), random() % 100);
	  tmp = octstr_format("%s/%s", mmbox_home, df);
	  ctmp = octstr_get_cstr(tmp);
	  fd = open(ctmp, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
	  if (fd >= 0 && 
	      mm_lockfile(fd,ctmp,1) != 0) {
	       unlink(ctmp);
	       close(fd);
	       fd = -1;
	  }
	  octstr_destroy(tmp);
	  
     } while (i++ < MAXTRIES && fd < 0);

     return fd;
}

static int open_mmbox_index(char *mmbox_dir, int shouldblock)
{
     char fbuf[256];
     int i, fd;
     
     sprintf(fbuf, "%s/%s", mmbox_dir, IDXFILE);

     i = 0;
     do 	 
	  if ((fd = open(fbuf, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)) < 0) {
	       error(0, "Failed to open mmbox index file [%s], error: %s!",
		     fbuf, strerror(errno));
	       break;
	  }  else if (mm_lockfile(fd, fbuf, shouldblock) != 0) {	  
	       close(fd);
	       fd = -1;
	  }
     while (i++ < MAXTRIES && fd < 0);
     
     return fd;
}

static Octstr *linearise_string_list(List *l, char *sep)
{
     int i, n;

     Octstr *s = octstr_create("");

     for (i = 0, n = gwlist_len(l); i < n; i++) {
	  Octstr *p = gwlist_get(l,i);
	  if (p)
	       octstr_format_append(s, "%s%S", (i == 0) ? "" : sep, p);
     }
     return s;
}

static List *parse_string_list(char *buf)
{
     int i = 0;
     char sbuf[128], *p = buf;
     List *l = gwlist_create();
     
     while (sscanf(p, "%s%n", sbuf, &i) > 0) {
	  gwlist_append(l, octstr_create(sbuf));
	  p += i;
     }
     
     return l;
}

static char *skip_space(char *s)
{
     while (*s && isspace(*s))
	  s++;
     return s;     
}

/* Format of Index file:
 * each message is described by a single line:
 * df state flag1 flag2 flag3 ...
 */
static int update_mmbox_index(int fd, char *mmbox_dir, int cmd, 
			      Octstr *df, Octstr *state, List *flags, long msgsize)
{
     char fbuf[256], linbuf[1024];
     int tempfd;
     FILE *fp;
     
     /* Make a temp file. */
     
     sprintf(fbuf, "%.128s/t%s.%ld.%ld",
	     mmbox_dir, IDXFILE, time(NULL), random() % 1000);

     tempfd = open(fbuf, 
		   O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
     if (tempfd < 0 ) { 
	  error(0, "mmbox.update_index: Failed to open temp file %s: error = %s\n", 
		fbuf, strerror(errno));
	  
	  goto done;
     } else if (mm_lockfile(tempfd, fbuf, 0) != 0) { /* Lock it. */
	  error(0, "mmbox.update_index: Failed lock  temp file %s: error = %s\n", 
		     fbuf, strerror(errno));

	  close(tempfd);
	  tempfd = -1;
	  goto done;
	  
     }
     fp = fdopen(fd, "r");
     
     if (!fp) {
	  error(0, "mmbox.update_index: Failed fdopen on tempfd, file %s: error = %s\n",
		
		fbuf, strerror(errno));
		  
	  close(tempfd);
	  tempfd = -1;
	  goto done;
     }
     
     while (fgets(linbuf, sizeof linbuf, fp) != NULL) {
	  char idx[128], xstate[32];
	  Octstr *outs = NULL;
	  int i;
	  int size;
	  
	  sscanf(linbuf, "%s %s %d%n", idx, xstate, &size, &i);
	  
	  if (df && octstr_str_compare(df, idx) == 0)
	       if (cmd == ITEM_DEL || cmd == ITEM_ADD)
		    goto loop; /* Skip it. */
	       else  { /* MOD. */
		    Octstr *p = linearise_string_list(flags, " ");
		    outs = octstr_format("%S %S %d %S\n", df, state, msgsize, p);
		    octstr_destroy(p);
	       }
	  else { /* Copy out as-is */
	       char *p = skip_space(linbuf + i);
	       outs = octstr_format("%s %s %d %s%s",
				    idx, xstate, 
				    size,
				    p,
				    (strchr(p, '\n') != NULL ? "" : "\n"));
	  }
     loop:
	  if (outs) {
	       if (octstr_len(outs) > 0) 
		    octstr_write_to_socket(tempfd, outs);	       
	       octstr_destroy(outs);
	  }
     }     

     if (cmd == ITEM_ADD) { /* Finally, for ADD, just add it. */
	  Octstr *s, *p = linearise_string_list(flags, " ");
	  s = octstr_format("%S %S %d %S\n", df, state, msgsize, p);
	  octstr_destroy(p);	  
	  octstr_write_to_socket(tempfd, s);	       
	  octstr_destroy(s);	  
     }
     fsync(tempfd);     

     sprintf(linbuf, "%.128s/%s",
	     mmbox_dir, IDXFILE);
     rename(fbuf, linbuf);

     fclose(fp);
 done:

     return tempfd;
}

static List *make_mm_flags(List *oflags, List *flag_cmds)
{
     List *l = oflags ? oflags : gwlist_create();
     int i, n;

     for (i = 0, n = gwlist_len(l); i < n; i++) { /* cleanup list. */
	  Octstr *x = gwlist_get(l,i);
	  int ch = octstr_get_char(x, 0);
	  
	  if (ch == '+' || ch == '-' || ch == '/')
	       octstr_delete(x,0,1);
     }
     
     for (i = 0, n = (flag_cmds ? gwlist_len(flag_cmds) : 0); i<n; i++) {
	  Octstr *x = gwlist_get(flag_cmds,i);
	  int ch = octstr_get_char(x, 0);
	  char *s = octstr_get_cstr(x);
	  int j, m, cmd;
	  
	  if (ch == '+' || ch == '-' || ch == '/') {
	       s++;
	       cmd = ch;
	  } else 
	       cmd = '+';
	  
	  /* Find it in original. If existent, remove it. */
	  for (j = 0, m = gwlist_len(l); j < m; j++) 
	       if (octstr_str_compare(gwlist_get(l,j),s) == 0)  { 
		    Octstr *y = gwlist_get(l,j);
		    gwlist_delete(l,j,1);
		    octstr_destroy(y);
		    j--;
		    m--;
	       } 
	  
	  if (cmd == '+' || cmd == '/')
	       gwlist_append(l, octstr_create(s));
     }     


     return l;
}

Octstr *mms_mmbox_addmsg(char *mmbox_root, char *user, MmsMsg *msg, List *flag_cmds, Octstr *dfltstate)
{
     int ifd = -1, nifd, dfd = -1;
     char df[128];
     Octstr *home = user_mmbox_dir(mmbox_root,user);
     Octstr *s = octstr_create(""), *sdf = NULL;
     List *flags = NULL;
     Octstr *state = NULL;
     int msize;
     
     if (!home)
	  goto done;
     ifd = open_mmbox_index(octstr_get_cstr(home),1);
     
     if (ifd < 0) 
	  goto done;
     
     if ((dfd = mkdf(df, octstr_get_cstr(home))) < 0) {
	  error(0, "mmbox_add: failed to create data file, home=%s - %s!", 
		octstr_get_cstr(home), strerror(errno));
	  goto done;
     }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
三级欧美韩日大片在线看| 国产日韩精品一区二区浪潮av| 亚洲人成精品久久久久| 北条麻妃一区二区三区| 中文字幕中文字幕在线一区| 99久久精品费精品国产一区二区| 26uuu国产电影一区二区| 久色婷婷小香蕉久久| 26uuu精品一区二区三区四区在线| 激情av综合网| 中文字幕中文字幕中文字幕亚洲无线| 91在线云播放| 日韩成人dvd| 久久久一区二区三区捆绑**| 懂色av噜噜一区二区三区av| 亚洲欧美怡红院| 欧美色偷偷大香| 免费看欧美女人艹b| 精品国产91乱码一区二区三区| 国产精品香蕉一区二区三区| 国产精品久久久久国产精品日日| 91国偷自产一区二区三区成为亚洲经典 | 欧美日韩视频在线第一区| 日日骚欧美日韩| 久久免费视频一区| 99久久伊人精品| 天天综合色天天综合色h| 26uuu国产电影一区二区| 99热精品一区二区| 日韩 欧美一区二区三区| 国产日韩综合av| 欧美日韩三级一区| 国产精一区二区三区| 亚洲一区二区五区| 久久综合精品国产一区二区三区| 不卡的av在线| 青椒成人免费视频| 中文字幕在线不卡一区二区三区 | 中文字幕视频一区二区三区久| 欧美色精品在线视频| 国产精品白丝jk白祙喷水网站 | 亚洲一区二区在线免费看| 精品动漫一区二区三区在线观看| 97se亚洲国产综合自在线不卡 | 国产精品一线二线三线| 亚洲国产精品久久人人爱| 亚洲国产精华液网站w| 777xxx欧美| 在线观看一区二区精品视频| 国产在线看一区| 午夜视频在线观看一区| 中文字幕一区二区三区不卡| 亚洲精品一线二线三线无人区| 91精品1区2区| 波多野结衣精品在线| 国产一区二区成人久久免费影院| 日一区二区三区| 一区二区不卡在线播放| 国产精品久久久久久久第一福利| 欧美成人欧美edvon| 69av一区二区三区| 日本道色综合久久| 99久久久免费精品国产一区二区| 国产一区二区三区观看| 免费看精品久久片| 五月综合激情网| 亚洲成人久久影院| 亚洲人吸女人奶水| 一区在线中文字幕| 国产精品国产三级国产专播品爱网 | 午夜激情综合网| 亚洲最快最全在线视频| 亚洲另类色综合网站| 综合久久国产九一剧情麻豆| 日本一二三不卡| 国产精品视频一二| 中文字幕不卡三区| 国产精品久久久久久久久久久免费看| 久久精品视频在线免费观看| 精品久久久久久最新网址| 日韩精品一区二区在线观看| 91精品国产91综合久久蜜臀| 91精品国产综合久久国产大片| 欧美日韩免费电影| 欧美日本高清视频在线观看| 777xxx欧美| 日韩美一区二区三区| 日韩美女视频在线| 精品国产亚洲在线| 日本一区二区电影| 日韩一区在线免费观看| 亚洲手机成人高清视频| 一区二区在线观看免费视频播放| 亚洲柠檬福利资源导航| 亚洲网友自拍偷拍| 日韩av中文字幕一区二区| 麻豆91免费看| 国产成人免费高清| 91麻豆蜜桃一区二区三区| 日本精品一区二区三区高清| 欧美日韩一级视频| 欧美一级生活片| 久久久美女艺术照精彩视频福利播放| 国产欧美日韩在线| 亚洲免费高清视频在线| 日韩制服丝袜av| 国产成人超碰人人澡人人澡| 91亚洲永久精品| 欧美乱熟臀69xxxxxx| 久久一区二区三区四区| 中文字幕一区二区视频| 亚洲电影一级黄| 激情五月激情综合网| 972aa.com艺术欧美| 欧美一区二区三区爱爱| 国产欧美视频一区二区三区| 一二三区精品福利视频| 久久精品理论片| 91视频在线观看| 日韩欧美第一区| 一区二区三区四区五区视频在线观看| 日韩综合小视频| jizzjizzjizz欧美| 欧美一区二区三区在线电影| 国产欧美精品国产国产专区| 一区二区三区视频在线观看| 老司机免费视频一区二区| av一区二区三区四区| 日韩欧美国产1| 亚洲最色的网站| 夫妻av一区二区| 日韩午夜在线观看视频| 亚洲三级免费观看| 国产一区二区中文字幕| 精品视频资源站| 最近中文字幕一区二区三区| 久久99精品国产麻豆婷婷| 一本大道av一区二区在线播放| 日韩精品一区二| 亚洲国产日韩一区二区| 成人h动漫精品一区二| 日韩女优av电影在线观看| 亚洲美腿欧美偷拍| 国产成人av电影免费在线观看| 7777精品伊人久久久大香线蕉的 | 日韩电影在线免费看| 成人小视频在线| 精品乱人伦小说| 日韩黄色在线观看| 欧美影院一区二区| 亚洲欧洲综合另类在线| 成人福利视频网站| 久久久久高清精品| 乱一区二区av| 日韩一区二区不卡| 日韩国产精品久久久| 在线免费不卡视频| 亚洲男人的天堂一区二区| 成人久久视频在线观看| 久久久久97国产精华液好用吗| 免费精品视频最新在线| 欧美老肥妇做.爰bbww视频| 亚洲综合在线电影| 91麻豆文化传媒在线观看| 中文字幕一区二区三中文字幕| 国产成人鲁色资源国产91色综 | 老色鬼精品视频在线观看播放| 欧美片网站yy| 亚洲一二三四在线| 欧美最猛性xxxxx直播| 悠悠色在线精品| 欧美午夜一区二区三区免费大片| 亚洲人成网站精品片在线观看| 91视频观看免费| 亚洲激情在线激情| 欧美亚洲高清一区二区三区不卡| 亚洲综合色成人| 欧美酷刑日本凌虐凌虐| 天天综合网 天天综合色| 日韩区在线观看| 激情久久久久久久久久久久久久久久| 久久综合999| 国产91在线看| ●精品国产综合乱码久久久久| 91视频在线看| 五月天激情综合| 精品免费视频一区二区| 国产91精品露脸国语对白| 国产精品久久久久久久久图文区 | 亚洲美女免费在线| 在线免费一区三区| 天天色天天操综合| www国产精品av| 成人h动漫精品一区二区 | 亚洲一区二区三区精品在线| 欧美老女人在线| 国产a视频精品免费观看| 亚洲毛片av在线| 3d成人动漫网站| 国产成人在线视频播放|