34 fdev.set<
Fifo, &Fifo::ioCb>(
this);
52 fd = ::open(name.c_str(), O_RDONLY | O_NONBLOCK | O_CLOEXEC);
56 log(
fmt(
"open(%s): %s.\n", name.c_str(), strerror(
errno)));
60 fdev.start(fd, EV_READ);
65void Fifo::processLine(
const char * line)
69 log(
fmt(
"FIFO: %s\n", line));
93 bool remoteDriver = !!strstr(line,
"@");
98 n = sscanf(line,
"%s %511[^\n]",
cmd, tDriver);
102 int len = strlen(tDriver);
103 while ((ptr = strstr(tDriver,
"\"")))
105 memmove(ptr, ptr + 1, --len);
112 n = sscanf(line,
"%s %s -%1c \"%511[^\"]\" -%1c \"%511[^\"]\" -%1c \"%511[^\"]\" -%1c \"%511[^\"]\"",
cmd,
113 tDriver, arg[0], var[0], arg[1], var[1], arg[2], var[2], arg[3], var[3]);
116 int n_args = (n - 2) / 2;
119 for (j = 0; j < n_args; j++)
121 if (arg[j][0] ==
'n')
127 log(
fmt(
"With name: %s\n", tName));
129 else if (arg[j][0] ==
'c')
135 log(
fmt(
"With config: %s\n", envConfig));
137 else if (arg[j][0] ==
's')
143 log(
fmt(
"With skeketon: %s\n", envSkel));
145 else if (arg[j][0] ==
'p')
151 log(
fmt(
"With prefix: %s\n", envPrefix));
156 if (!strcmp(
cmd,
"start"))
164 log(
fmt(
"FIFO: Starting driver %s\n", tDriver));
167 if (remoteDriver == 0)
172 localDp->envDev = tName;
173 localDp->envConfig = envConfig;
174 localDp->envSkel = envSkel;
175 localDp->envPrefix = envPrefix;
186 for (
auto dp :
DvrInfo::drivers)
188 if (dp ==
nullptr)
continue;
190 if (dp->
name == tDriver)
196 log(
fmt(
"FIFO: Shutting down driver: %s\n", tDriver));
208 int rd = ::read(fd, buffer + bufferPos,
sizeof(buffer) - 1 - bufferPos);
213 buffer[bufferPos] =
'\0';
222 if (
errno == EAGAIN ||
errno == EWOULDBLOCK)
return;
232 for(
int i = 0; i < bufferPos; ++i)
234 if (buffer[i] ==
'\n')
241 memmove(buffer, buffer + i, bufferPos);
246 if ((
unsigned)bufferPos >=
sizeof(buffer) - 1)
248 log(
fmt(
"Fifo overflow"));
254void Fifo::ioCb(ev::io &,
int revents)
256 if (EV_ERROR & revents)
261 log(
fmt(
"Error on fifo: %s\n", strerror(sockErrno)));
266 else if (revents & EV_READ)
CommandLineArgs * userConfigurableArguments
void log(const std::string &log)
std::string fmt(const char *fmt,...)
bool isHandlingDevice(const std::string &dev) const
Fifo(const std::string &name)
constexpr unsigned maxStringBufferLength