static void *us_handle_client (void *arg) { int fdin; int fdout; FILE *fhin, *fhout; fdin = *((int *) arg); free (arg); arg = NULL; DEBUG ("unixsock plugin: us_handle_client: Reading from fd #%i", fdin); fdout = dup (fdin); if (fdout < 0) { char errbuf[1024]; ERROR ("unixsock plugin: dup failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); close (fdin); pthread_exit ((void *) 1); } fhin = fdopen (fdin, "r"); if (fhin == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); close (fdin); close (fdout); pthread_exit ((void *) 1); return ((void *) 1); } fhout = fdopen (fdout, "w"); if (fhout == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); fclose (fhin); /* this closes fdin as well */ close (fdout); pthread_exit ((void *) 1); return ((void *) 1); } /* change output buffer to line buffered mode */ if (setvbuf (fhout, NULL, _IOLBF, 0) != 0) { char errbuf[1024]; ERROR ("unixsock plugin: setvbuf failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); fclose (fhin); fclose (fhout); pthread_exit ((void *) 1); return ((void *) 0); } while (42) { char buffer[1024]; char buffer_copy[1024]; char *fields[128]; int fields_num; int len; errno = 0; if (fgets (buffer, sizeof (buffer), fhin) == NULL) { if ((errno == EINTR) || (errno == EAGAIN)) continue; if (errno != 0) { char errbuf[1024]; WARNING ("unixsock plugin: failed to read from socket #%i: %s", fileno (fhin), sstrerror (errno, errbuf, sizeof (errbuf))); } break; } len = strlen (buffer); while ((len > 0) && ((buffer[len - 1] == '\n') || (buffer[len - 1] == '\r'))) buffer[--len] = '\0'; if (len == 0) continue; sstrncpy (buffer_copy, buffer, sizeof (buffer_copy)); fields_num = strsplit (buffer_copy, fields, sizeof (fields) / sizeof (fields[0])); if (fields_num < 1) { fprintf (fhout, "-1 Internal error\n"); fclose (fhin); fclose (fhout); pthread_exit ((void *) 1); return ((void *) 1); } if (strcasecmp (fields[0], "getval") == 0) { handle_getval (fhout, buffer); } else if (strcasecmp (fields[0], "getthreshold") == 0) { handle_getthreshold (fhout, buffer); } else if (strcasecmp (fields[0], "putval") == 0) { handle_putval (fhout, buffer); } else if (strcasecmp (fields[0], "listval") == 0) { handle_listval (fhout, buffer); } else if (strcasecmp (fields[0], "putnotif") == 0) { handle_putnotif (fhout, buffer); } else if (strcasecmp (fields[0], "flush") == 0) { handle_flush (fhout, buffer); } else { if (fprintf (fhout, "-1 Unknown command: %s\n", fields[0]) < 0) { char errbuf[1024]; WARNING ("unixsock plugin: failed to write to socket #%i: %s", fileno (fhout), sstrerror (errno, errbuf, sizeof (errbuf))); break; } } } /* while (fgets) */ DEBUG ("unixsock plugin: us_handle_client: Exiting.."); fclose (fhin); fclose (fhout); pthread_exit ((void *) 0); return ((void *) 0); } /* void *us_handle_client */
static int handle_fuse_request(struct fuse *fuse, struct fuse_handler* handler, const struct fuse_in_header *hdr, const void *data, size_t data_len) { switch (hdr->opcode) { case FUSE_LOOKUP: { /* bytez[] -> entry_out */ const char* name = data; return handle_lookup(fuse, handler, hdr, name); } case FUSE_FORGET: { const struct fuse_forget_in *req = data; return handle_forget(fuse, handler, hdr, req); } case FUSE_GETATTR: { /* getattr_in -> attr_out */ const struct fuse_getattr_in *req = data; return handle_getattr(fuse, handler, hdr, req); } case FUSE_SETATTR: { /* setattr_in -> attr_out */ const struct fuse_setattr_in *req = data; return handle_setattr(fuse, handler, hdr, req); } // case FUSE_READLINK: // case FUSE_SYMLINK: case FUSE_MKNOD: { /* mknod_in, bytez[] -> entry_out */ const struct fuse_mknod_in *req = data; const char *name = ((const char*) data) + sizeof(*req); return handle_mknod(fuse, handler, hdr, req, name); } case FUSE_MKDIR: { /* mkdir_in, bytez[] -> entry_out */ const struct fuse_mkdir_in *req = data; const char *name = ((const char*) data) + sizeof(*req); return handle_mkdir(fuse, handler, hdr, req, name); } case FUSE_UNLINK: { /* bytez[] -> */ const char* name = data; return handle_unlink(fuse, handler, hdr, name); } case FUSE_RMDIR: { /* bytez[] -> */ const char* name = data; return handle_rmdir(fuse, handler, hdr, name); } case FUSE_RENAME: { /* rename_in, oldname, newname -> */ const struct fuse_rename_in *req = data; const char *old_name = ((const char*) data) + sizeof(*req); const char *new_name = old_name + strlen(old_name) + 1; return handle_rename(fuse, handler, hdr, req, old_name, new_name); } // case FUSE_LINK: case FUSE_OPEN: { /* open_in -> open_out */ const struct fuse_open_in *req = data; return handle_open(fuse, handler, hdr, req); } case FUSE_READ: { /* read_in -> byte[] */ const struct fuse_read_in *req = data; return handle_read(fuse, handler, hdr, req); } case FUSE_WRITE: { /* write_in, byte[write_in.size] -> write_out */ const struct fuse_write_in *req = data; const void* buffer = (const __u8*)data + sizeof(*req); return handle_write(fuse, handler, hdr, req, buffer); } case FUSE_STATFS: { /* getattr_in -> attr_out */ return handle_statfs(fuse, handler, hdr); } case FUSE_RELEASE: { /* release_in -> */ const struct fuse_release_in *req = data; return handle_release(fuse, handler, hdr, req); } case FUSE_FSYNC: { const struct fuse_fsync_in *req = data; return handle_fsync(fuse, handler, hdr, req); } // case FUSE_SETXATTR: // case FUSE_GETXATTR: // case FUSE_LISTXATTR: // case FUSE_REMOVEXATTR: case FUSE_FLUSH: { return handle_flush(fuse, handler, hdr); } case FUSE_OPENDIR: { /* open_in -> open_out */ const struct fuse_open_in *req = data; return handle_opendir(fuse, handler, hdr, req); } case FUSE_READDIR: { const struct fuse_read_in *req = data; return handle_readdir(fuse, handler, hdr, req); } case FUSE_RELEASEDIR: { /* release_in -> */ const struct fuse_release_in *req = data; return handle_releasedir(fuse, handler, hdr, req); } // case FUSE_FSYNCDIR: case FUSE_INIT: { /* init_in -> init_out */ const struct fuse_init_in *req = data; return handle_init(fuse, handler, hdr, req); } default: { TRACE("[%d] NOTIMPL op=%d uniq=%llx nid=%llx\n", handler->token, hdr->opcode, hdr->unique, hdr->nodeid); return -ENOSYS; } } }