History

proper signal handling

Sigrid Haflínudóttir committed 6 years ago

Commit 00f36641 parent 84e2e461 file · +75 −15Browse files

Unified · Split

9pex.c+75−15
@@ -74,6 +74,10 @@ static char *t2s[] = { · 73 unmodified lines
7474 [Twstat-Tversion] = "Twstat",
7575 };
7676
77+static char *modes[] = {
78+ "read", "write", "rdwr", "exec",
79+};
80+
7781 static char *Enoauth = "authentication not required";
7882 static char *Eunknownfid = "unknown fid";
7983 static char *Enowstat = "wstat prohibited";
@@ -136,8 +140,15 @@ canrw(int rdonly, int block) · 56 unmodified lines
136140 FD_SET(out, &e);
137141 memset(&t, 0, sizeof(t));
138142 t.tv_usec = 1000;
139− if ((n = select(max(in, out) + 1, &r, &w, &e, block ? NULL : &t)) < 0 || FD_ISSET(in, &e) || FD_ISSET(out, &e))
140− return -1;
143+ for (;;) {
144+ errno = 0;
145+ if ((n = select(max(in, out) + 1, &r, &w, &e, block ? NULL : &t)) < 0 || FD_ISSET(in, &e) || FD_ISSET(out, &e)) {
146+ if (errno == EINTR)
147+ continue;
148+ return -1;
149+ }
150+ break;
151+ }
141152
142153 fl = 0;
143154 if (FD_ISSET(in, &r))
@@ -156,11 +167,15 @@ wrsend(void) · 12 unmodified lines
156167
157168 if (wrend == 0)
158169 return 0;
159− for (n = 0; n < wrend && (w = write(out, wrbuf+n, wrend-n)) > 0; n += w);
160− if (w <= 0) {
161− if (errno != EPIPE) /* remote end closed */
162− perror("write");
163− return -1;
170+ for (n = 0; n < wrend; n += w) {
171+ errno = 0;
172+ if ((w = write(out, wrbuf+n, wrend-n)) <= 0) {
173+ if (errno == EINTR)
174+ continue;
175+ if (errno != EPIPE) /* remote end closed */
176+ perror("write");
177+ return -1;
178+ }
164179 }
165180 if (debug >= 2)
166181 trace("<- %d bytes, %d left\n", wrend, wroff-wrend);
@@ -542,13 +557,17 @@ ctxread(C9ctx *c, uint32_t size, int *err) · 375 unmodified lines
542557 used(c);
543558 r = 0;
544559 *err = 0;
545− for (n = 0; n < size && (r = read(in, rdbuf, size)) > 0; n += r);
546− if (r <= 0) {
547− if (r == 0)
548− eof = 1;
549− else
550− *err = 1;
551− return NULL;
560+ for (n = 0; n < size; n += r) {
561+ errno = 0;
562+ if ((r = read(in, rdbuf, size)) <= 0) {
563+ if (r == EINTR)
564+ continue;
565+ if (r == 0)
566+ eof = 1;
567+ else
568+ *err = 1;
569+ return NULL;
570+ }
552571 }
553572
554573 return rdbuf;
@@ -800,6 +819,37 @@ ctxt(C9ctx *c, C9t *t) · 245 unmodified lines
800819 }
801820 }
802821
822+static void
823+sigdebug(int s)
824+{
825+ Fid *f;
826+ int i, n;
827+
828+ used(s);
829+ n = 0;
830+ for (i = 0; i < numfids; i++) {
831+ f = fids[i];
832+ if (f == NULL)
833+ continue;
834+
835+ fprintf(stderr, "fid %u ", f->fid);
836+
837+ if (f->dir != NULL)
838+ fprintf(stderr, "open mode=dir ");
839+ else if (f->fd >= 0)
840+ fprintf(stderr, "open mode=%s%s%s ", modes[(f->mode & 0xf)], (f->mode & C9trunc) ? ",trunc" : "", (f->mode & C9rclose) ? ",rclose" : "");
841+
842+ fprintf(stderr, "qid=[path=%"PRIu64" type=0x%02x version=%"PRIu32"] iounit=%d ", f->qid.path, f->qid.type, f->qid.version, f->iounit);
843+ fprintf(stderr, " %s %s\n", f->path, f->name);
844+ n++;
845+ }
846+
847+ fprintf(stderr, "fids\t%d\n", n);
848+ fprintf(stderr, "tags\t%d\n", numtags);
849+ fprintf(stderr, "uids\t%d\n", numuids);
850+ fprintf(stderr, "gids\t%d\n", numgids);
851+}
852+
803853 int
804854 main(int argc, char **argv)
805855 {
@@ -807,6 +857,7 @@ main(int argc, char **argv) · 1 unmodified line
807857 char *err;
808858 Fid *f;
809859 struct parg_state ps;
860+ struct sigaction sa;
810861 int can, i, c, rdonly, block;
811862
812863 parg_init(&ps);
@@ -876,7 +927,16 @@ main(int argc, char **argv) · 63 unmodified lines
876927 wrbuf = calloc(1, wrbufsz);
877928 wroff = wrend = 0;
878929
879− signal(SIGPIPE, SIG_IGN);
930+ memset(&sa, 0, sizeof(sa));
931+ sa.sa_handler = SIG_IGN;
932+ sa.sa_flags = SA_RESTART;
933+ sigaction(SIGPIPE, &sa, NULL);
934+
935+ memset(&sa, 0, sizeof(sa));
936+ sa.sa_handler = sigdebug;
937+ sa.sa_flags = SA_RESTART;
938+ sigfillset(&sa.sa_mask);
939+ sigaction(SIGUSR1, &sa, NULL);
880940
881941 err = NULL;
882942 rdonly = block = 1; /* at first we wait until the client sends in data */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t