Example #1
0
File: v_api.c Project: pqhwan/TCP
//malloc and initialize sending and receiving window
void init_windows(socket_t *so) {

	so->sendw = malloc(sizeof(sendw_t));
	so->recvw = malloc(sizeof(recvw_t));
	CB_INIT(&so->sendw->buf, WINSIZE);

	CB_INIT(&so->recvw->buf, WINSIZE); 

	pthread_mutexattr_t mutexattr;
	pthread_mutexattr_init(&mutexattr);
	pthread_mutex_init(&so->sendw->lock, &mutexattr);

	so->sendw->retrans_q_head = NULL; //retransmissionqueue
	so->sendw->ackhistory = NULL; //ack history table
	so->sendw->hack = so->myseq+1;  //highest ack TODO wrap
	so->sendw->rto = 0.00350;
	so->sendw->srtt = 0.00350;

	so->recvw->oor_q_head = NULL; //out of order packet list
	so->recvw->oor_q_size = 0;

	return;
}
Example #2
0
int maildir_newshared_next(struct maildir_newshared_enum_cb *info,
			   int *eof,
			   int (*cb_func)(struct maildir_newshared_enum_cb *),
			   void *cb_arg)
{
	char linebuf[BUFSIZ];
	int rc;
	char *p;
	const char *name;
	const char *homedir;
	const char *maildir;
	uid_t uid;
	gid_t gid;
	off_t nbytes;

#define CB_INIT(name_,homedir_,maildir_,uid_,gid_) \
	info->name=name_; info->homedir=homedir_; info->maildir=maildir_; \
	info->uid=uid_; info->gid=gid_; info->cb_arg=cb_arg;

	*eof=0;

	while (fgets(linebuf, sizeof(linebuf), info->fp) != NULL)
	{
		nbytes=strlen(linebuf);

		if (nbytes && linebuf[nbytes-1] == '\n')
			linebuf[nbytes-1]=0;

		p=strchr(linebuf, '#');
		if (p) *p=0;

		p=strchr(linebuf, '\t');
		++info->linenum;
		if (p)
		{
			name=linebuf;
			*p++=0;

			if (*p == '*')
			{
				p=strchr(p, '\t');
				if (p)
				{
					const char *q;
					size_t n;

					*p++=0;
					maildir=p;
					p=strchr(p, '\t');
					if (p) *p=0;

					q=strrchr(info->indexfile, '/');
					if (q)
						++q;
					else q=info->indexfile;

					n=strlen(info->indexfile)-strlen(q);

					p=malloc(n+strlen(maildir)+1);
					if (!p)
						return -1;

					if (n)
						memcpy(p, info->indexfile, n);
					strcpy(p+n, maildir);


					CB_INIT(name, NULL, p, 0, 0);

					info->cb_arg=cb_arg;
					rc= (*cb_func)(info);

					free(p);
					info->startingpos += nbytes;
					return rc;
				}
			}
			else
			{
				uid=libmail_atouid_t(p);
				p=strchr(p, '\t');
				if (uid && p)
				{
					*p++=0;
					gid=libmail_atogid_t(p);
					p=strchr(p, '\t');
					if (gid && p)
					{
						*p++=0;
						homedir=p;
						p=strchr(p, '\t');
						maildir="./Maildir";

						if (p)
						{
							*p++=0;
							if (*p && *p != '\t')
								maildir=p;
							p=strchr(p, '\t');
							if (p) *p=0;
						}

						CB_INIT(name, homedir,
							maildir,
							uid,
							gid);

						info->cb_arg=cb_arg;
						rc=(*cb_func)(info);
						info->startingpos += nbytes;
						return rc;
					}
				}
			}
		}

		if (linebuf[0])
		{
			fprintf(stderr, "ERR: %s(%d): syntax error.\n",
				info->indexfile, (int)info->linenum);
		}
		info->startingpos += nbytes;
	}
	*eof=1;
	return 0;
}