コード例 #1
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int delete_key_handler(char *input, int *cursor, int *len)
{
	int this_cursor = *cursor;
	int this_len	= *len;
	
	if (this_len != this_cursor)
	{
		int i;
		int len;
		/* 从光标所在位置开始,输入字符串依次向后移动一位 */
		for (i = this_cursor; i < this_len; i++)
			input[i] = input[i + 1];
		/* 输入字符串最后一个字符清零 */
		input[this_len--] = '\0';
		/* 计算从光标所在位置字符串长度 */
		len = strlen(input + this_cursor);
		/* 输出从光标所在位置开始的字符串 */
		sh_write(input + this_cursor, len);
		/* 输出空格,覆盖最后一个字符 */
		sh_write(" ", 1);	
		/* 光标回退 */
	
		for (i = 0; i <= len; i++)
			sh_write("\b", 1);
	}

	*cursor = this_cursor;
	*len	= this_len;
	
	return RET_READ_CHAR_CONT;
}
コード例 #2
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void send_net(net_header_rec *nh, unsigned int *list, char *text, char *byname)
{
  int f;
  char s[100];
  long l1;

  sprintf(s,"%sP0-WT.NET",net_data);
  f=sh_open(s,O_RDWR | O_BINARY | O_APPEND | O_CREAT, S_IREAD | S_IWRITE);
  sh_lseek(f,0L,SEEK_END);
  if (!list)
    nh->list_len=0;
  if (!text)
    nh->length=0;
  if (nh->list_len)
    nh->tosys=0;
  l1=nh->length;
  if (byname && *byname)
    nh->length += strlen(byname)+1;
  sh_write(f,(void *)nh,sizeof(net_header_rec));
  if (nh->list_len)
    sh_write(f,(void *)list,2*(nh->list_len));
  if (byname && *byname)
    sh_write(f,byname, strlen(byname)+1);
  if (nh->length)
    sh_write(f,(void *)text,l1);
  sh_close(f);
}
コード例 #3
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
long huge_xfer(int fd, void huge *buf, unsigned sz, unsigned nel, int wr)
{
  long nxfr=0, len=((long)sz) * ((long)nel);
  char huge *xbuf = (char huge *)buf;
  unsigned cur,cur1;

  while (len>0) {

    if (len>MAX_XFER)
      cur=MAX_XFER;
    else
      cur=len;

    if (wr)
      cur1=sh_write(fd,(char *)xbuf,cur);
    else
      cur1=sh_read(fd,(char *)xbuf,cur);

    if (cur1!=65535) {
      len  -= cur1;
      nxfr += cur1;
      xbuf  = ((char huge *)buf) + nxfr;
      /* not xbuf += cur1 due to bug in certain version of compiler */
    }

    if (cur1!=cur)
      break;
  }

  return(nxfr);
}
コード例 #4
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
static void input_back(int back, char *input, int *cursor, int *len)
{
	int this_cursor = *cursor;
	int this_len	= *len;
	
	while (back--) 
	{
		if (this_len == this_cursor) 
		{
			input[--this_cursor] = 0;
			sh_write("\b \b", 3);
		} 
		else 
		{
			int i;
			int len;
			/* 光标位置向后移动一位 */
			this_cursor--; 
			/* 从光标所在位置开始,输入字符串依次向后移动一位 */
			for (i = this_cursor; i <= this_len; i++)
			{
				input[i] = input[i + 1];
			}
			/* 计算从光标所在位置字符串长度 */
			len = strlen(input + this_cursor);
			/* 输出退格符,并且光标位置向后移动一位,即覆盖要删除的字符 */
			sh_write("\b", 1);
			/* 输出从光标所在位置开始的字符串 */
			sh_write(input + this_cursor, len);
			/* 输出空格,覆盖最后一个字符 */
			sh_write(" ", 1);
			/* 光标回退 */
			for (i = 0; i <= len; i++)
			{
				sh_write("\b", 1);
			}
		}
		this_len--;
	}

	*cursor = this_cursor;
	*len	= this_len;
	
	return;
}
コード例 #5
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void save_gat(int f)
{
  long l;

  l=((long)gat_section)*GATSECLEN;
  sh_lseek(f,l,SEEK_SET);
  sh_write(f,(void *)gat,4096);
  lock_status();
  status.filechange[filechange_posts]++;
  save_status();
}
コード例 #6
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void add_post(postrec *pp)
{
    postrec p;
    int close_file=0;

  /* open the sub, if necessary  */
    
    if (sub_f <= 0)
    {
        open_sub(1);
        close_file=1;
    }

    if (sub_f>=0)
    {
        /* get updated info */
        read_status();
        sh_lseek(sub_f, 0L, SEEK_SET);
        sh_read(sub_f, &p, sizeof(postrec));

        /* one more post */
        p.owneruser++;
        nummsgs=p.owneruser;
        sh_lseek(sub_f, 0L, SEEK_SET);
        sh_write(sub_f, &p, sizeof(postrec));

        /* add the new post */
        sh_lseek(sub_f, ((long)nummsgs)*sizeof(postrec), SEEK_SET);
        sh_write(sub_f, pp, sizeof(postrec));

        /* we've modified the sub */
        believe_cache=0;
        subchg=0;
        sub_dates[curlsub]=pp->qscan;
    }

    if (close_file)
        close_sub();
}
コード例 #7
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int ctrl_B_key_handler(char *input, int *cursor, int *len)
{
	int this_cursor = *cursor;
	
	if (this_cursor) 
	{
		sh_write("\b", 1);
		this_cursor--;
	}

	*cursor = this_cursor;
	
	return RET_READ_CHAR_CONT;
}
コード例 #8
0
ファイル: terma.c プロジェクト: halhen/terma
void
x_on_keypress(XEvent *event)
{
    XKeyEvent *e = &event->xkey;
    KeySym ksym;
    char buf[32];
    int len;
    Status status;

    len = XmbLookupString(X.xic, e, buf, sizeof(buf)-1, &ksym, &status);

    if (!term_handle_keypress(ksym, e->state) && len > 0) {
        sh_write(buf, len);
    }
}
コード例 #9
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int ctrl_F_key_handler(char *input, int *cursor, int *len)
{
	int this_cursor = *cursor;
	int this_len	= *len;
	
	if (this_cursor < this_len) 
	{
		sh_write(&input[this_cursor], 1);
		this_cursor++;
	}

	*cursor = this_cursor;
	*len	= this_len;
	
	return RET_READ_CHAR_CONT;
}
コード例 #10
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void save_status(void)
/* saves system status in memory to disk */
{
  char s[81];
  if (statusfile<0) {
    sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
    statusfile=sh_open1(s,O_RDWR | O_BINARY);
  } else {
    lseek(statusfile, 0L, SEEK_SET);
  }
  if (statusfile<0) {
    printf("STATUS.DAT >CANNOT< be saved!!");
  } else {
    sh_write(statusfile, (void *)(&status), sizeof(statusrec));
    statusfile=sh_close(statusfile);
  }
}
コード例 #11
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int ctrl_P_key_handler(char *input, int *cursor, int *len)
{
	char *history_input = NULL;

	sh_clean_input(input, cursor, len);
	
	history_input = get_prev_history();
	if (history_input)
	{
		
		strcpy(input, history_input);
		*cursor = *len = strlen(input);
		sh_write(input, *len);
	}
	
	return RET_READ_CHAR_CONT;
}
コード例 #12
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void write_user(unsigned int un, userrec *u)
{
  char s[81];
  long pos;
  int f;

  if ((un<1) || (un>syscfg.maxusers))
    return;

  sprintf(s,"%sUSER.LST",syscfg.datadir);
  f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  if (f>=0) {
    pos=((long) syscfg.userreclen) * ((long) un);
    sh_lseek(f,pos,SEEK_SET);
    sh_write(f, (void *)u, syscfg.userreclen);
    sh_close(f);
  }
}
コード例 #13
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void savebase(int b)
/* saves message information in memory to disk */
{
  int f;
  char s[81];

  sprintf(s, "%s%s.SUB", syscfg.datadir, subboards[b].filename);
  f = sh_open(s, O_RDWR | O_BINARY | O_TRUNC | O_CREAT, S_IREAD | S_IWRITE);
  sh_lseek(f, 0L, SEEK_SET);
  msgs[0].owneruser = nummsgs;
  sh_write(f, (void *)(&msgs[0]), ((nummsgs+1) * sizeof(postrec)));
  sh_close(f);
  if (nummsgs) {
    sub_dates[b]=msgs[nummsgs].qscan;
  } else {
    sub_dates[b]=1;
  }
    lock_status();
    status.filechange[filechange_posts]++;
  save_status();
}
コード例 #14
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void remove_link(messagerec *m1, char *aux)
/* deletes a message */
{
  messagerec m;
  char s[81],s1[81];
  int f;
  long csec,nsec;

  m=*m1;
  strcpy(s,syscfg.msgsdir);
  switch(m.storage_type) {
    case 0:
    case 1:
      ltoa(m.stored_as,s1,16);
      if (m.storage_type==1) {
        strcat(s,aux);
	strcat(s,"\\");
      }
      strcat(s,s1);
      unlink(s);
      break;
    case 2:
      f=open_file(aux);
      csec=m.stored_as;
      while ((csec>0) && (csec<2048)) {
	nsec=(long) gat[csec];
	gat[csec]=0;
	csec=nsec;
      }
      sh_lseek(f,0L,SEEK_SET);
      sh_write(f,(void *)gat,4096);
      sh_close(f);
      break;
    default:
      /* illegal storage type */
      break;
  }
  setcbrk(1);
}
コード例 #15
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int ctrl_H_key_handler(char *input, int *cursor, int *len)
{
	int back		= 0;
	int this_len	= *len;
	int this_cursor = *cursor;

	if (this_len == 0 || this_cursor == 0)
	{
		sh_write("\a", 1);
		return RET_READ_CHAR_CONT;
	}

	back = 1;
	 
	if (back) 
	{
		input_back(back, input, cursor, len);
		return RET_READ_CHAR_CONT;
	}

	return RET_READ_CHAR_DONE;
}
コード例 #16
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void set_gat_section(int f, int section)
{
  long l,l1;
  int i;

  if (gat_section!=section) {
    l=filelength(f);
    l1=((long)section)*GATSECLEN;
    if (l<l1) {
      chsize(f,l1);
      l=l1;
    }
    sh_lseek(f,l1,SEEK_SET);
    if (l<(l1+4096L)) {
      for (i=0; i<2048; i++)
        gat[i]=0;
      sh_write(f,(void *)gat, 4096);
    } else {
      sh_read(f,(void *)gat, 4096);
    }
    gat_section=section;
  }
}
コード例 #17
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
int open_file(char *fn)
/* opens a WWIV Type-2 data file */
{
  int f,i;
  char s[81];

  sprintf(s,"%s%s.DAT",syscfg.msgsdir,fn);
  f=sh_open1(s,O_RDWR | O_BINARY);
  if (f<0) {
    f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
    for (i=0; i<2048; i++)
      gat[i]=0;
    sh_write(f,(void *)gat,4096);
    strcpy(gatfn,fn);
/*    chsize(f,4096L + (75L * 1024L)); */
  }
  if (strcmp(gatfn,fn)) {
    sh_lseek(f,0L,SEEK_SET);
    sh_read(f,(void *)gat,4096);
    strcpy(gatfn,fn);
  }
  return(f);
}
コード例 #18
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void savefile(char *b, long l1, messagerec *m1, char *aux)
/* saves a message in memory to disk */
{
  int f,gatp,i5,i4,gati[128];
  messagerec m;
  char s[81],s1[81];
  int section;
  long l2;

  setcbrk(0);
  m=*m1;
  switch(m.storage_type) {
    case 0:
    case 1:
      lock_status();
      m.stored_as=status.qscanptr++;
      save_status();
      ltoa(m.stored_as,s1,16);
      strcpy(s,syscfg.msgsdir);
      if (m.storage_type==1) {
        strcat(s,aux);
        strcat(s,"\\");
      }
      strcat(s,s1);
      f=sh_open(s,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
      sh_write(f, (void *)b,l1);
      sh_close(f);
      break;
    case 2:
      f=open_file(aux);
      if (f>0) {
        for (section=0; section<1024; section++) {
          set_gat_section(f,section);
          gatp=0;
          i5=(int) ((l1 + 511L)/512L);
          i4=1;
          while ((gatp<i5) && (i4<2048)) {
            if (gat[i4]==0)
              gati[gatp++]=i4;
            ++i4;
          }
          if (gatp>=i5) {
            l2=MSG_STARTING;
            gati[gatp]=-1;
            for (i4=0; i4<i5; i4++) {
              sh_lseek(f,l2 + 512L * (long)(gati[i4]),SEEK_SET);
              sh_write(f,(void *)(&b[i4*512]),512);
              gat[gati[i4]]=gati[i4+1];
            }
            save_gat(f);
            break;
          }
        }
        sh_close(f);
      }
      m.stored_as=((long) gati[0]) + ((long)gat_section)*2048L;
      break;
    case 255:
      f=sh_open(aux,O_RDWR | O_CREAT | O_BINARY,S_IREAD | S_IWRITE);
      sh_write(f, (void *)b,l1);
      sh_close(f);
      break;
    default:
      break;
  }
  farfree((void *)b);
  *m1=m;
}
コード例 #19
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int ctrl_C_key_handler(char *input, int *cursor, int *len)
{	
	sh_write("\a", 1);

	return RET_READ_CHAR_DONE;
}
コード例 #20
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
int iscan1(int si, int quick)
/*
 * Initializes use of a sub value (subboards[], not usub[]).  If quick, then
 * don't worry about anything detailed, just grab qscan info.
 */
{
  postrec p;

  /* make sure we have cache space */
  if (!cache) {
    cache=malloca(MAX_TO_CACHE*sizeof(postrec));
    if (!cache)
      return(0);
  }
  /* forget it if an invalid sub # */
  if ((si<0) || (si>=num_subs))
    return(0);

  /* skip this stuff if being called from the WFC cache code */
  if (!quick) {

    /* go to correct net # */
    if (xsubs[si].num_nets)
      set_net_num(xsubs[si].nets[0].net_num);
    else
      set_net_num(0);

    /* see if a sub has changed */
    read_status();
    /* if already have this one set, nothing more to do */
    if (si==currsub)
      return(1);
  }
  currsub=si;

  /* sub cache no longer valid */
  believe_cache=0;

  /* set sub filename */
  sprintf(subdat_fn,"%s%s.SUB",syscfg.datadir,subboards[si].filename);
  /* open file, and create it if necessary */
  if (open_sub(0)<0) {
    if (open_sub(1)<0)
      return(0);
    p.owneruser=0;
    sh_write(sub_f,(void *) &p,sizeof(postrec));
  }

  /* set sub */
  curlsub=si;
  subchg=0;
  last_msgnum=0;

  /* read in first rec, specifying # posts */
  sh_lseek(sub_f,0L,SEEK_SET);
  sh_read(sub_f,&p, sizeof(postrec));
  nummsgs=p.owneruser;

  /* read in sub date, if don't already know it */
  if (sub_dates[si]==0) {
    if (nummsgs) {
      sh_lseek(sub_f, ((long) nummsgs)*sizeof(postrec), SEEK_SET);
      sh_read(sub_f, &p, sizeof(postrec));
      sub_dates[si]=p.qscan;
    } else {
      sub_dates[si]=1;
    }
  }

  /* close file */
  close_sub();

  /* iscanned correctly */
  return(1);
}
コード例 #21
0
ファイル: sh_keymap.c プロジェクト: hominlinx/hot-pot-lab
int normal_char_type_handler(char c, char *input, int *cursor, int *len)
{
	int this_cursor = *cursor;
	int this_len	= *len;

	/* 回车 */
	if (c == '\n')
	{
		sh_write("\n", 1);
		return RET_READ_CHAR_DONE;
	}

	/* 换行 */
	if (c == '\r')
	{
		sh_write("\r\n", 2);
		return RET_READ_CHAR_DONE;
	}
	
	if (this_cursor == this_len) 
	{
		/* 
		 * 正常字符串输入,光标位置与输入字符串长度值相等,
		 * 在已输入字符串末尾插入新的字符
		 */
		 
		/* append to end of line */
		if ((short)c == 20 && this_cursor == 0)
		{
			return RET_READ_CHAR_DONE;
		}
	
		input[this_cursor] = c;
		if (this_len < (RL_BUF_SIZE - 1)) 
		{
			/* 未超出输入字符串最大长度,光标位置和输入字符串长度值加1 */
			this_len++;
			this_cursor++;
		} 
		else 
		{
			/* 超出输入字符串最大长度,返回最大输入字符串 */
			sh_write("\a", 1);
			return RET_READ_CHAR_DONE;
		}
	}
	else 
	{
		/* 
		 * 光标位置与输入字符串长度值不相等,主要操作是在已输入字符串
		 * 中间插入新的字符
		 */
		 
		/* insert */
		int i = 0;
		/* move everything one character to the right */
		if (this_len >= (RL_BUF_SIZE - 2)) 
		{
			this_len--;
		}
		
		for (i = this_len; i >= this_cursor; i--)
		{
			input[i + 1] = input[i];
		}
	
		/* sh_write what we've just added */
		input[this_cursor] = c;
		
		sh_write(&input[this_cursor], this_len - this_cursor + 1);
		for (i = 0; i < (this_len - this_cursor + 1); i++)
		{
			sh_write("\b", 1);
		}
	
		this_len++;
		this_cursor++;
	}

	*cursor = this_cursor;
	*len	= this_len;

	return RET_READ_CHAR_CONT;
}
コード例 #22
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void deletemsg(int mn)
{
  postrec *p1, p;
  int close_file=0;
  unsigned int nb;
  char *buf;
//  char scratch[181];
  long len, l, cp;

  /* open file, if needed */
  if (sub_f <= 0) {
    open_sub(1);
    close_file=1;
  }

  /* see if anything changed */
  read_status();

  if (sub_f >= 0) {
    if ((mn>0) && (mn<=nummsgs)) {
      buf=(char *)malloca(BUFSIZE);
      if (buf) {
        p1=get_post(mn);
        remove_link(&(p1->msg),(subboards[curlsub].filename));

        cp=((long)mn+1)*sizeof(postrec);
        len=((long)(nummsgs+1))*sizeof(postrec);

        do {
          l=len-cp;
          if (l<BUFSIZE)
            nb=(int)l;
          else
            nb=BUFSIZE;
          if (nb) {
            sh_lseek(sub_f, cp, SEEK_SET);
            sh_read(sub_f, buf, nb);
            sh_lseek(sub_f, cp-sizeof(postrec), SEEK_SET);
            sh_write(sub_f, buf, nb);
            cp += nb;
          }
        } while (nb==BUFSIZE);

        /* update # msgs */
        sh_lseek(sub_f, 0L, SEEK_SET);
        sh_read(sub_f, &p, sizeof(postrec));
        p.owneruser--;
        nummsgs=p.owneruser;
        sh_lseek(sub_f, 0L, SEEK_SET);
        sh_write(sub_f, &p, sizeof(postrec));

        /* cache is now invalid */
        believe_cache = 0;

        bbsfree(buf);
      }
    }
  }

  /* close file, if needed */
  if (close_file)
    close_sub();

}
コード例 #23
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void gate_msg(net_header_rec *nh, char *text, unsigned short nn, char *byname,unsigned int *list, unsigned short fnn)
{
  char newname[128], fn[100], qn[100], on[100];
  char *ti, nm[82], *ss;
  int f,i;
  unsigned short ntl;

  if (strlen(text)<80) {
    ti=text;
    text+=strlen(ti)+1;
    ntl=nh->length-strlen(ti)-1;
    ss=strchr(text,'\r');
    if (ss && (ss-text<80) && (ss-text<ntl)) {
      strncpy(nm,text,ss-text);
      nm[ss-text]=0;
      ss++;
      if (*ss=='\n')
        ss++;
      nh->length-=(ss-text);
      ntl-=(ss-text);
      text=ss;

      qn[0]=on[0]=0;

      if (fnn==65535) {

        strcpy(newname,nm);
        ss=strrchr(newname,'@');
        if (ss) {
          sprintf(ss+1,"%u",net_networks[nn].sysnum);
          ss=strrchr(nm,'@');
          if (ss) {
            ++ss;
            while ((*ss>='0') && (*ss<='9'))
              ++ss;
            strcat(newname,ss);
          }
          strcat(newname,"\r\n");
        }
      } else {
        if ((nm[0]=='`') && (nm[1]=='`')) {
          for (i=strlen(nm)-2; i>0; i--) {
            if ((nm[i]=='`') && (nm[i+1]=='`')) {
              break;
            }
          }
          if (i>0) {
            i+=2;
            strncpy(qn,nm,i);
            qn[i]=' ';
            qn[i+1]=0;
          }
        } else
          i=0;
        if (qn[0]==0) {
          ss=strrchr(nm,'#');
          if (ss) {
            if ((ss[1]>='0') && (ss[1]<='9')) {
              *ss=0;
              ss--;
              while ((ss>nm) && (*ss==' ')) {
                *ss=0;
                ss--;
              }
            }
          }
          if (nm[0]) {
            if (nh->fromuser)
              sprintf(qn,"``%s`` ",nm);
            else
              strcpy(on,nm);
          }
        }
        if ((on[0]==0) && (nh->fromuser==0)) {
          strcpy(on,nm+i);
        }
        if (on[0])
          sprintf(newname,"%s%s %s AT %u\r\n",qn, net_networks[fnn].name,
                  on, nh->fromsys);
        else
          sprintf(newname,"%s%s #%u AT %u\r\n",qn, net_networks[fnn].name,
                  nh->fromuser, nh->fromsys);

        nh->fromsys=net_networks[nn].sysnum;
        nh->fromuser=0;
      }


      nh->length += strlen(newname);
      if ((nh->main_type == main_type_email_name) ||
          (nh->main_type == main_type_new_post))
        nh->length += strlen(byname)+1;
      sprintf(fn,"%sP0-WT.NET",net_data);
      f=sh_open(fn,O_RDWR|O_BINARY|O_APPEND | O_CREAT, S_IREAD|S_IWRITE);
      if (f) {
        sh_lseek(f,0L,SEEK_END);
        if (!list)
          nh->list_len=0;
        if (nh->list_len)
          nh->tosys=0;
        sh_write(f,nh, sizeof(net_header_rec));
        if (nh->list_len)
          sh_write(f,list,2*(nh->list_len));
        if ((nh->main_type == main_type_email_name) ||
            (nh->main_type == main_type_new_post))
          sh_write(f,byname, strlen(byname)+1);
        sh_write(f,ti,strlen(ti)+1);
        sh_write(f,newname,strlen(newname));
        sh_write(f,text,ntl);
        sh_close(f);
      }
    }
  }
}
コード例 #24
0
ファイル: DAWG.C プロジェクト: TRI0N/WWIVTOSS
void send_email2(void)
{
    char s[81],scratch[81],log[81];
    int f, i;
    long len,len2;
    char *b;
    long thetime,dat;
    int len3;
    mailrec m,m1;
    userrec ur;
    messagerec msg;
    struct date dt;
    struct time tm;
    char *month[] = {"Bug","Jan","Feb","Mar","Apr","May","Jun",
		     "Jul","Aug","Sep","Oct","Nov","Dec"};

    m.touser=user_to_num;

    time(&thetime);

    len=(unsigned) strlen(buffer);
    len2=len;
    b=((char *)malloc(len+1024));
    len=0;
    sprintf(log,"þ Incoming mail for %s from %s (%s)\n",fido_to_user,fido_from_user,origi_node);
    write_log(log);
    sprintf(s,"%s (%s)",fido_from_user,origi_node);
    addline(b,s,&len);

    /* Get date/time of Email creation. */
    /* Ditto the \015 for the time/date string. */

    strncpy(scratch,fido_date_line,20);
    scratch[20]='\0';

    /* Build the date - cumbersome, but it needs to be done */
	/* Build tblock as we go along so we can have a pretty date */
	scratch[2] = '\0';	/* make day a string */
	dt.da_day = atoi(scratch);
	for (i=1;i<13;i++)
	if (strncmpi(month[i],&scratch[3],3) == 0)
	{
	    dt.da_mon = i;
	    break;
        }
	scratch[9] = '\0';	/* make year a string */
    dt.da_year = atoi(&scratch[7]);
    if (dt.da_year>90)
        dt.da_year += 1900;
    else
        dt.da_year += 2000;
	scratch[13] = '\0'; /* make hour a string */
	tm.ti_hour = atoi(&scratch[11]);
	scratch[16] = '\0'; /* make minute a string */
	tm.ti_min = atoi(&scratch[14]);
	scratch[19] = '\0'; /* make second a string */
	tm.ti_sec = atoi(&scratch[17]);
	tm.ti_hund = 0;
	dat = dostounix(&dt,&tm);
	strncpy(scratch,ctime(&(time_t)dat),24);
	scratch[24]='\0';
    strcat(scratch,"\r\n");
    strcpy(s,scratch);
    addline(b,s,&len);

    strcat(b,buffer);
    len += len2;
    len=(unsigned) strlen(b);

    if (b[len-1]!=26)
        b[len++]=26;

    m.msg.storage_type=2;
    msg.stored_as=0L;
    msg.storage_type=2;
    savefile(b,len,&msg,"EMAIL");
    m.msg=msg;

    i=0;
    strcpy(m.title,fido_title);
//    i=strlen(m.title);
//    m.title[i+1]=net_num;
//    m.title[i+2]=0;
    m.title[80]=net_num;
    m.title[81]=0;
//    i=0;
    read_user(user_to_num,&ur);
    ++ur.waiting;
    write_user(user_to_num,&ur);
    lock_status();
    save_status();

    m.anony=i;
    m.fromsys=atoi(wwiv_node);
    m.fromuser=0;
    m.tosys=0;
    m.status=status_new_net;
    time((long *)&(m.daten));

    f=open_email(1);
    len3=(int) filelength(f)/sizeof(mailrec);
    if (len3==0)
	i=0;
    else
    {
        i=len3-1;
        sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
        sh_read(f,(void *)&m1,sizeof(mailrec));
        while ((i>0) && (m1.tosys==0) && (m1.touser==0))
        {
            --i;
            sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
	    sh_read(f,(void *)&m1,sizeof(mailrec));
	}
        if ((m1.tosys) || (m1.touser))
            ++i;
    }
    sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
    sh_write(f,(void *)&m,sizeof(mailrec));
    sh_close(f);

    free(buffer);
}
コード例 #25
0
ファイル: gemsuper.c プロジェクト: ragnar76/emutos
static UWORD crysbind(WORD opcode, LONG pglobal, WORD control[], WORD int_in[], WORD int_out[], LONG addr_in[])
{
        LONG    maddr;
        LONG    tree;
        WORD    mouse, ret;
        WORD    unsupported = FALSE;

        maddr = 0;
        ret = TRUE;

        switch(opcode)
        {       
                                /* Application Manager                  */
          case APPL_INIT:
#if DBG_GEMSUPER
                aestrace("appl_init()");
#endif
                LWSET(pglobal, AES_VERSION);    /* version number       */
                LWSET(pglobal+2, 0x0001);       /* num of concurrent procs*/
/*              LLSET(pglobal, 0x00010200L);
*/
                LWSET(pglobal+4, rlr->p_pid);
                sh_deskf(0, pglobal+6);
                LWSET(pglobal+20, gl_nplanes);
                LLSET(pglobal+22, ADDR(&D));
                                                /* reset dispatcher     */
                                                /*  count to let the app*/
                                                /*  run a while.        */
                dspcnt = 0;
                ret = ap_init();
                break;
          case APPL_READ:
          case APPL_WRITE:
                ap_rdwr(opcode == APPL_READ ? MU_MESAG : MU_SDMSG, 
                        fpdnm(NULLPTR, AP_RWID), AP_LENGTH, AP_PBUFF);
                break;
          case APPL_FIND:
                ret = ap_find( AP_PNAME );
                break;
          case APPL_TPLAY:
                ap_tplay(AP_TBUFFER, AP_TLENGTH, AP_TSCALE);
                break;
          case APPL_TRECORD:
                ret = ap_trecd(AP_TBUFFER, AP_TLENGTH);
                break;
#if CONF_WITH_PCGEM
          case APPL_YIELD:
                dsptch();
                break;
#endif
          case APPL_EXIT:
#if DBG_GEMSUPER
                aestrace("appl_exit()");
#endif
                ap_exit();
                break;
                                /* Event Manager                        */
          case EVNT_KEYBD:
                  ret = ev_block(MU_KEYBD, 0x0L);
                break;
          case EVNT_BUTTON:
                ret = ev_button(B_CLICKS, B_MASK, B_STATE, &EV_MX);
                break;
          case EVNT_MOUSE:
                ret = ev_mouse((MOBLK *)&MO_FLAGS, &EV_MX);
                break;
          case EVNT_MESAG:
#if DBG_GEMSUPER
                aestrace("evnt_mesag()");
#endif
                ap_rdwr(MU_MESAG, rlr, 16, ME_PBUFF);
                break;
          case EVNT_TIMER:
                ev_timer( HW(T_HICOUNT) + LW(T_LOCOUNT) );
                break;
          case EVNT_MULTI:
#if DBG_GEMSUPER
                aestrace("evnt_multi()");
#endif
                if (MU_FLAGS & MU_TIMER)
                  maddr = HW(MT_HICOUNT) + LW(MT_LOCOUNT);
                tree = HW(MB_CLICKS) | LW((MB_MASK << 8) | MB_STATE);
                ret = ev_multi(MU_FLAGS, (MOBLK *)&MMO1_FLAGS, (MOBLK *)&MMO2_FLAGS, 
                        maddr, tree, MME_PBUFF, &EV_MX);
                break;
          case EVNT_DCLICK:
                ret = ev_dclick(EV_DCRATE, EV_DCSETIT);
                break;
                                /* Menu Manager                         */
          case MENU_BAR:
                if (gl_mnppd == rlr || gl_mnppd == NULL)
                  mn_bar(MM_ITREE, SHOW_IT, rlr->p_pid);
                else
                  menu_tree[rlr->p_pid] = (SHOW_IT) ? MM_ITREE : 0x0L;
                break;
          case MENU_ICHECK:
                do_chg(MM_ITREE, ITEM_NUM, CHECKED, CHECK_IT, FALSE, FALSE);
                break;
          case MENU_IENABLE:
                do_chg(MM_ITREE, (ITEM_NUM & 0x7fff), DISABLED, 
                        !ENABLE_IT, ((ITEM_NUM & 0x8000) != 0x0), FALSE);
                break;
          case MENU_TNORMAL:
                if (gl_mntree == menu_tree[rlr->p_pid])
                  do_chg(MM_ITREE, TITLE_NUM, SELECTED, !NORMAL_IT, 
                                TRUE, TRUE);
                break;
          case MENU_TEXT:
                tree = MM_ITREE;
                strcpy((char *)LLGET(OB_SPEC(ITEM_NUM)), 
                         (char *)MM_PTEXT);   
                break;
          case MENU_REGISTER:
                ret = mn_register(MM_PID, MM_PSTR);
                break;
          case MENU_UNREGISTER:
#if CONF_WITH_PCGEM
                /* distinguish between menu_unregister() and menu_popup() */
                if (IN_LEN == 1)
                  mn_unregister( MM_MID );
                else
#endif
                  unsupported = TRUE;
                break;
          case MENU_CLICK:
                /* distinguish between menu_click() and menu_attach() */
                /*
                 * although menu_click() is PC-GEM only, it's always
                 * enabled because the desktop uses it.
                 */
                if (IN_LEN == 2) {
                  if (MN_SETIT)
                    gl_mnclick = MN_CLICK;
                  ret = gl_mnclick;
                } else
                  unsupported = TRUE;
                break;
                                /* Object Manager                       */
          case OBJC_ADD:
                ob_add(OB_TREE, OB_PARENT, OB_CHILD);
                break;
          case OBJC_DELETE:
                ob_delete(OB_TREE, OB_DELOB);
                break;
          case OBJC_DRAW:
                gsx_sclip((GRECT *)&OB_XCLIP);
                ob_draw(OB_TREE, OB_DRAWOB, OB_DEPTH);
                break;
          case OBJC_FIND:
                ret = ob_find(OB_TREE, OB_STARTOB, OB_DEPTH, 
                                OB_MX, OB_MY);
                break;
          case OBJC_OFFSET:
                ob_offset(OB_TREE, OB_OBJ, &OB_XOFF, &OB_YOFF);
                break;
          case OBJC_ORDER:
                ob_order(OB_TREE, OB_OBJ, OB_NEWPOS);
                break;
          case OBJC_EDIT:
                gsx_sclip(&gl_rfull);
                OB_ODX = OB_IDX;
                ret = ob_edit(OB_TREE, OB_OBJ, OB_CHAR, &OB_ODX, OB_KIND);
                break;
          case OBJC_CHANGE:
                gsx_sclip((GRECT *)&OB_XCLIP);
                ob_change(OB_TREE, OB_DRAWOB, OB_NEWSTATE, OB_REDRAW);
                break;
                                /* Form Manager                         */
          case FORM_DO:
                ret = fm_do(FM_FORM, FM_START);
                break;
          case FORM_DIAL:
                ret = fm_dial(FM_TYPE, (GRECT *)&FM_X);
                break;
          case FORM_ALERT:
                ret = fm_alert(FM_DEFBUT, FM_ASTRING);
                break;
          case FORM_ERROR:
                ret = fm_error(FM_ERRNUM);
                break;
          case FORM_CENTER:
                ob_center(FM_FORM, (GRECT *)&FM_XC);
                break;
          case FORM_KEYBD:
                gsx_sclip(&gl_rfull);
                FM_OCHAR = FM_ICHAR;
                FM_ONXTOB = FM_INXTOB;
                ret = fm_keybd(FM_FORM, FM_OBJ, &FM_OCHAR, &FM_ONXTOB);
                break;
          case FORM_BUTTON:
                gsx_sclip(&gl_rfull);
                ret = fm_button(FM_FORM, FM_OBJ, FM_CLKS, &FM_ONXTOB);
                break;
                                /* Graphics Manager                     */
          case GRAF_RUBBOX:
                gr_rubbox(GR_I1, GR_I2, GR_I3, GR_I4, 
                          &GR_O1, &GR_O2);
                break;
          case GRAF_DRAGBOX:
                gr_dragbox(GR_I1, GR_I2, GR_I3, GR_I4, (GRECT *)&GR_I5, 
                           &GR_O1, &GR_O2);
                break;
          case GRAF_MBOX:
                gr_movebox(GR_I1, GR_I2, GR_I3, GR_I4, GR_I5, GR_I6);
                break;
          case GRAF_GROWBOX:
                gr_growbox((GRECT *)&GR_I1, (GRECT *)&GR_I5);
                break;
          case GRAF_SHRINKBOX:
                gr_shrinkbox((GRECT *)&GR_I1, (GRECT *)&GR_I5);
                break;
          case GRAF_WATCHBOX:
                ret = gr_watchbox(GR_TREE, GR_OBJ, GR_INSTATE, GR_OUTSTATE);
                break;
          case GRAF_SLIDEBOX:
                ret = gr_slidebox(GR_TREE, GR_PARENT, GR_OBJ, GR_ISVERT);
                break;
          case GRAF_HANDLE:
                GR_WCHAR = gl_wchar;
                GR_HCHAR = gl_hchar;
                GR_WBOX = gl_wbox;
                GR_HBOX = gl_hbox;
                ret = gl_handle;
                break;
          case GRAF_MOUSE:
                if (GR_MNUMBER > 255)
                {
                  if (GR_MNUMBER == M_OFF)
                    gsx_moff();
                  if (GR_MNUMBER == M_ON)
                    gsx_mon();
                }
                else
                {
                  if (GR_MNUMBER != 255)                
                  {
                    switch(GR_MNUMBER) {
                      case 1:
                        mouse = MICE01;
                        break;
                      case 2:
                        mouse = MICE02;
                        break;
                      case 3:
                        mouse = MICE03;
                        break;
                      case 4:
                        mouse = MICE04;
                        break;
                      case 5:
                        mouse = MICE05;
                        break;
                      case 6:
                        mouse = MICE06;
                        break;
                      case 7:
                        mouse = MICE07;
                        break;
                      default:
                        mouse = MICE00;
                        break;
                    }
                    maddr = *(LONG *) &rs_bitblk[mouse];
                  }
                  else
                    maddr = GR_MADDR;
                  gsx_mfset(maddr);
                }
                break;
          case GRAF_MKSTATE:
                gr_mkstate(&GR_MX, &GR_MY, &GR_MSTATE, &GR_KSTATE);
                break;
                                /* Scrap Manager                        */
          case SCRP_READ:
                ret = sc_read((BYTE*)SC_PATH);
                break;
          case SCRP_WRITE:
                ret = sc_write((const BYTE*)SC_PATH);
                break;
#if CONF_WITH_PCGEM
          case SCRP_CLEAR:
                ret = sc_clear();
                break;
#endif
                                /* File Selector Manager                */
          case FSEL_INPUT:
                ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, NULL);
                break;
          case FSEL_EXINPUT:
                ret = fs_input((BYTE*)FS_IPATH, (BYTE*)FS_ISEL, &FS_BUTTON, (BYTE *)FS_ILABEL);
                break;
                                /* Window Manager                       */
          case WIND_CREATE:
                ret = wm_create(WM_KIND, (GRECT *)&WM_WX);
                break;
          case WIND_OPEN:
                wm_open(WM_HANDLE, (GRECT *)&WM_WX);
                break;
          case WIND_CLOSE:
                wm_close(WM_HANDLE);
                break;
          case WIND_DELETE:
                wm_delete(WM_HANDLE);
                break;
          case WIND_GET:
                wm_get(WM_HANDLE, WM_WFIELD, &WM_OX);
                break;
          case WIND_SET:
                  wm_set(WM_HANDLE, WM_WFIELD, &WM_IX);
                  break;
          case WIND_FIND:
                ret = wm_find(WM_MX, WM_MY);
                break;
          case WIND_UPDATE:
                wm_update(WM_BEGUP);
                break;
          case WIND_CALC:
                wm_calc(WM_WCTYPE, WM_WCKIND, WM_WCIX, WM_WCIY, 
                        WM_WCIW, WM_WCIH, &WM_WCOX, &WM_WCOY, 
                        &WM_WCOW, &WM_WCOH);
                break;
          case WIND_NEW:
                wm_new();
                break;
                                /* Resource Manager                     */
          case RSRC_LOAD:
                ret = rs_load(pglobal, RS_PFNAME);
                break;
          case RSRC_FREE:
                ret = rs_free(pglobal);
                break;
          case RSRC_GADDR:
                ret = rs_gaddr(pglobal, RS_TYPE, RS_INDEX, &ad_rso);
                break;
          case RSRC_SADDR:
                ret = rs_saddr(pglobal, RS_TYPE, RS_INDEX, RS_INADDR);
                break;
          case RSRC_OBFIX:
                rs_obfix(RS_TREE, RS_OBJ);
                break;
                                /* Shell Manager                        */
          case SHEL_READ:
                sh_read((BYTE*)SH_PCMD, (BYTE*)SH_PTAIL);
                break;
          case SHEL_WRITE:
                ret = sh_write(SH_DOEX, SH_ISGR, SH_ISCR, (const BYTE*)SH_PCMD, (const BYTE*)SH_PTAIL);
                break;
          case SHEL_GET:
                sh_get((void*)SH_PBUFFER, SH_LEN);
                break;
          case SHEL_PUT:
                sh_put((const void *)SH_PDATA, SH_LEN);
                break;
          case SHEL_FIND:
                ret = sh_find((BYTE*)SH_PATH);
                break;
          case SHEL_ENVRN:
                sh_envrn((BYTE**)SH_PATH, (const BYTE*)SH_SRCH);
                break;
#if CONF_WITH_PCGEM
          case SHEL_RDEF:
                sh_rdef((BYTE*)SH_LPCMD, (BYTE*)SH_LPDIR);
                break;
          case SHEL_WDEF:
                sh_wdef((const BYTE*)SH_LPCMD, (const BYTE*)SH_LPDIR);
                break;
#endif
          default:
                unsupported = TRUE;
                break;
        }

        if (unsupported) {
            kprintf("Bad AES function %d\n", opcode);
            if (opcode != 0)    /* Ignore the 0 since some PRGs are this call */
                fm_show(ALNOFUNC, &opcode, 1);
            ret = -1;
        }

        return(ret);
}