//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; }
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; }