int initGA(bus_t busnumber, long addr, char protocol, long type) { int i = 0; int rc = SRCP_OK; int number_ga = get_number_ga(busnumber); syslog_bus(busnumber, DBG_INFO, "init GA: %d %c", addr, protocol); if ((addr > 0) && (addr <= number_ga)) { char msg[100]; rc = bus_supports_protocol(busnumber, protocol); if (rc != SRCP_OK) { return rc; } ga[busnumber].gastate[addr].protocol = protocol; gettimeofday(&ga[busnumber].gastate[addr].inittime, NULL); ga[busnumber].gastate[addr].activetime = 0; ga[busnumber].gastate[addr].action = 0; ga[busnumber].gastate[addr].type = type; ga[busnumber].gastate[addr].id = addr; for (i = 0; i < MAXGAPORT; i++) { ga[busnumber].gastate[addr].tv[i].tv_sec = 0; ga[busnumber].gastate[addr].tv[i].tv_usec = 0; } if (buses[busnumber].init_ga_func != NULL) rc = (*buses[busnumber].init_ga_func) (&ga[busnumber]. gastate[addr]); if (rc == SRCP_OK) { ga[busnumber].gastate[addr].state = 1; describeGA(busnumber, addr, msg); enqueueInfoMessage(msg); } return rc; } else { return SRCP_UNSUPPORTEDDEVICE; } }
/** * GET */ int handleGET(sessionid_t sessionid, bus_t bus, char *device, char *parameter, char *reply, size_t length) { struct timeval akt_time; int rc = SRCP_UNSUPPORTEDDEVICEGROUP; *reply = 0x00; gettimeofday(&akt_time, NULL); if (bus_has_devicegroup(bus, DG_FB) && strncasecmp(device, "FB", 2) == 0) { long int nelem, port; nelem = sscanf(parameter, "%ld", &port); if (nelem >= 1) rc = infoFB(bus, port, reply, length); else rc = srcp_fmt_msg(SRCP_LISTTOOSHORT, reply, akt_time); } else if (bus_has_devicegroup(bus, DG_GL) && strncasecmp(device, "GL", 2) == 0) { long nelem, addr; nelem = sscanf(parameter, "%ld", &addr); if (nelem >= 1) rc = cacheInfoGL(bus, addr, reply); else rc = srcp_fmt_msg(SRCP_LISTTOOSHORT, reply, akt_time); } else if (bus_has_devicegroup(bus, DG_GA) && strncasecmp(device, "GA", 2) == 0) { long addr, port, nelem; nelem = sscanf(parameter, "%ld %ld", &addr, &port); switch (nelem) { case 0: case 1: rc = srcp_fmt_msg(SRCP_LISTTOOSHORT, reply, akt_time);; break; case 2: rc = infoGA(bus, addr, port, reply); break; default: rc = srcp_fmt_msg(SRCP_LISTTOOLONG, reply, akt_time);; } } else if (bus_has_devicegroup(bus, DG_SM) && strncasecmp(device, "SM", 2) == 0) { long addr, value1, value2; int nelem; int type; char ctype[MAXSRCPLINELEN]; nelem = sscanf(parameter, "%ld %s %ld %ld", &addr, ctype, &value1, &value2); if (nelem < 3) { rc = SRCP_LISTTOOSHORT; } else { type = -1; if (strcasecmp(ctype, "REG") == 0) type = REGISTER; else if (strcasecmp(ctype, "CVBIT") == 0) type = CV_BIT; else if (strcasecmp(ctype, "PAGE") == 0) type = PAGE; else if (strcasecmp(ctype, "CV") == 0) type = CV; if (type == -1) { rc = SRCP_WRONGVALUE; } else { if (type != CV_BIT) value2 = 0; if (type == CV_BIT && nelem < 4) { rc = SRCP_LISTTOOSHORT; } else { rc = infoSM(bus, GET, type, addr, value1, value2, 0, reply); } } } } else if (bus_has_devicegroup(bus, DG_POWER) && strncasecmp(device, "POWER", 5) == 0) { rc = infoPower(bus, reply); } else if (bus_has_devicegroup(bus, DG_SERVER) && strncasecmp(device, "SERVER", 6) == 0) { rc = infoSERVER(reply); } else if (bus_has_devicegroup(bus, DG_TIME) && strncasecmp(device, "TIME", 4) == 0) { rc = infoTIME(reply); if (rc != SRCP_INFO) { rc = srcp_fmt_msg(SRCP_NODATA, reply, akt_time); } } else if (strncasecmp(device, "DESCRIPTION", 11) == 0) { /* there are two descriptions */ long int addr; char devgrp[11]; int nelem = 0; if (strlen(parameter) > 0) nelem = sscanf(parameter, "%10s %ld", devgrp, &addr); if (nelem <= 0) { rc = describeBus(bus, reply); } else { if (bus_has_devicegroup(bus, DG_DESCRIPTION)) { syslog_bus(bus, DBG_INFO, "DESCRIPTION: devgrp=%s addr=%ld", devgrp, addr); if (strncmp(devgrp, "GL", 2) == 0) rc = cacheDescribeGL(bus, addr, reply); else if (strncmp(devgrp, "GA", 2) == 0) rc = describeGA(bus, addr, reply); else if (strncmp(devgrp, "FB", 2) == 0) rc = describeFB(bus, addr, reply); else if (strncmp(devgrp, "SESSION", 7) == 0) rc = describeSESSION(bus, addr, reply); else if (strncmp(devgrp, "TIME", 4) == 0) rc = describeTIME(reply); else if (strncmp(devgrp, "SERVER", 6) == 0) rc = describeSERVER(bus, addr, reply); } else { rc = srcp_fmt_msg(SRCP_UNSUPPORTEDDEVICEGROUP, reply, akt_time); } } } else if (bus_has_devicegroup(bus, DG_LOCK) && (strncasecmp(device, "LOCK", 4) == 0)) { long int addr; char devgrp[10]; int nelem = -1; if (strlen(parameter) > 0) nelem = sscanf(parameter, "%s %ld", devgrp, &addr); if (nelem <= 1) { rc = srcp_fmt_msg(SRCP_LISTTOOSHORT, reply, akt_time); } else { rc = SRCP_UNSUPPORTEDDEVICEGROUP; if (strncmp(devgrp, "GL", 2) == 0) rc = describeLOCKGL(bus, addr, reply); else if (strncmp(devgrp, "GA", 2) == 0) rc = describeLOCKGA(bus, addr, reply); } } if (reply[0] == 0x00) rc = srcp_fmt_msg(rc, reply, akt_time); return rc; }