Пример #1
0
void cec_worker_init(void)
{
  cec_set_own_address(/*DEVICE_TYPE_UNREG*/ 0x0F);

  dprintk(1, "*** CEC INIT ***\n");
  str_status(cec_get_status());
  str_error(cec_get_error());
  dprintk(1, "~~~ CEC INIT ~~~\n");

  sendPingWithAutoIncrement();
}
Пример #2
0
static void check_status(DavDeleteXMLParser::DavxDeleteXmlIntern & par, const std::string & name){
    DAVIX_SLOG(DAVIX_LOG_DEBUG, DAVIX_LOG_XML, " status found -> parse it");
    std::string str_status(name);
    ltrim(str_status, StrUtil::isSpace());
    std::string::iterator it1, it2;
    it1 = std::find(str_status.begin(), str_status.end(), ' ');
    if( it1 != str_status.end()){
        it2 = std::find(it1+1, str_status.end(), ' ');
        std::string str_status_parsed(it1+1, it2);
        unsigned long res = strtoul(str_status_parsed.c_str(), NULL, 10);
        if(res != ULONG_MAX){
           DAVIX_SLOG(DAVIX_LOG_DEBUG, DAVIX_LOG_XML, " status value : {}", res);
           par._last_response_status = res;
           return;
        }
    }
    DAVIX_SLOG(DAVIX_LOG_VERBOSE, DAVIX_LOG_XML, "Invalid dav status field value");
    errno =0;
}
Пример #3
0
char *get_status(char *line, struct response *resp)
{
	enum status stat;
	char *t;
	int len;
	char *c =
	    get_token(line, &t, &len, false, REQUIRES_EITHER, "Invalid status");

	if (c == NULL)
		return c;

	for (stat = STATUS_OK; stat <= STATUS_ERROR; stat++) {
		const char *cmp_status = str_status(stat);

		if (strlen(cmp_status) != len)
			continue;

		if (strncasecmp(cmp_status, t, len) == 0) {
			enum requires_more requires_more = REQUIRES_MORE;

			resp->r_status = stat;

			if (stat == STATUS_COMPLETED
			    || (resp->r_cmd == CMD_QUIT && stat == STATUS_OK))
				requires_more = REQUIRES_NO_MORE;

			return SkipWhite(c, requires_more, "get_status");
		}
	}

	strcpy(errdetail, "Invalid status");
	strncpy(badtoken, t, len);
	badtoken[len] = '\0';
	errno = EINVAL;
	return NULL;
}
Пример #4
0
irqreturn_t cec_interrupt(int irq, void *dev_id)
{
  u8 status, error;
  
  dprintk(4, "#### CEC INTERUPT  START####\n");

  status = cec_get_status();
  error  = cec_get_error();
  
  if (status & CEC_STATUS_RECV_ERR) // Error while receiving
  {
    dprintk(3,"++++ CEC ERROR (RECV) ++++\n");
    str_error(error);
    str_status(status);
    cec_acknowledge();
  }
  else if (status & CEC_STATUS_SEND_ERR) // Error while sending
  {
    dprintk(3,"++++ CEC ERROR (SEND) ++++\n");
    str_error(error);
    str_status(status);
    if (status & CEC_STATUS_SEND_EOMSG) // End of Message
      cec_acknowledge_eom();
    else
      cec_acknowledge();

    isSending = 0;

    dprintk(4,"Retries: %d\n", retries);

    if (getIsFirstKiss() == 1) {
        if (error & CEC_ERROR_ACK)
        {
	  dprintk(0, "The above error is a wanted behaviour as this was a ping!\n");
          setIsFirstKiss(0);
        }
        else if(retries > 0)
        {
          sendMessageWithRetry(sizeOfSendBuf, sendBuf, retries - 1);
        }
    }
    else if(retries > 0)
    {
      sendMessageWithRetry(sizeOfSendBuf, sendBuf, retries - 1);
    }
  }
  else if (status & CEC_STATUS_RECV_BTF) // Receiving
  {
    if (status & CEC_STATUS_RECV_SOMSG) // Start of Message
    {
      isReceiving = 1;
      indexOfRecvBuf = 0; 
      memset(recvBuf, 0, RECV_BUF_SIZE);
    }

    recvBuf[indexOfRecvBuf] = cec_read_data();
    dprintk(3,"RECV 0x%0x\n", recvBuf[indexOfRecvBuf]);
    cec_acknowledge();
    indexOfRecvBuf++;

    if (status & CEC_STATUS_RECV_EOMSG) // End of Message
    {
      isReceiving = 0;
      parseRawMessage(indexOfRecvBuf, recvBuf, "RX");
    }
  }
  else if (status & CEC_STATUS_SEND_BTF) // Transmitting
  {
    if (status & CEC_STATUS_SEND_EOMSG) // End of Message
    {
      isSending = 0;
      cec_acknowledge();

      parseRawMessage(indexOfSendBuf, sendBuf, "TX");
    }
    else
    {
      cec_write_data(sendBuf[indexOfSendBuf]);
      indexOfSendBuf++;

      if(indexOfSendBuf == sizeOfSendBuf)
      {
        cec_acknowledge_eom();
      }
      else
      {
        cec_acknowledge();
      }
    }
  }
  
  dprintk(4, "#### CEC INTERUPT  END####\n");
  return IRQ_HANDLED;
}
Пример #5
0
char *parse_response(char *line, struct response *resp)
{
	char *rest;
	long long int dummy_len;

	if (resp->r_original == '\0')
		strcpy(resp->r_original, line);

	resp->r_cmd = NUM_COMMANDS;
	resp->r_tag = -1;

	rest = get_tag(line, resp, true, REQUIRES_MORE);

	if (rest == NULL)
		goto fail;

	rest = get_command(rest, &resp->r_cmd);

	if (rest == NULL)
		goto fail;

	rest = get_status(rest, resp);

	if (rest == NULL)
		goto fail;

	switch (resp->r_status) {
	case STATUS_OK:
		switch (resp->r_cmd) {
		case CMD_COMMENT:
		case CMD_HELLO:
			rest =
			    get_str(rest, resp->r_data, &resp->r_length,
				    REQUIRES_NO_MORE);
			break;

		case CMD_LOCKW:
		case CMD_LOCK:
		case CMD_UNLOCK:
		case CMD_TEST:
		case CMD_LIST:
		case CMD_HOP:
		case CMD_UNHOP:
		case NUM_COMMANDS:
			strcpy(errdetail, "Unexpected Status");
			errno = EINVAL;
			sprintf(badtoken, "%s", str_status(resp->r_status));
			goto fail;

		case CMD_ALARM:
			return get_long(rest, &resp->r_secs, REQUIRES_NO_MORE,
					"Invalid alarm time");

		case CMD_QUIT:
			return rest;

		case CMD_OPEN:
			rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
			if (rest == NULL)
				goto fail;
			rest =
			    get_long(rest, &resp->r_fno, REQUIRES_NO_MORE,
				     "Invalid file number");
			break;

		case CMD_CLOSE:
		case CMD_SEEK:
			rest = get_fpos(rest, &resp->r_fpos, REQUIRES_NO_MORE);
			break;

		case CMD_WRITE:
			rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
			if (rest == NULL)
				goto fail;
			rest =
			    get_longlong(rest, &resp->r_length,
					 REQUIRES_NO_MORE, "Invalid length");
			break;

		case CMD_READ:
			rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
			if (rest == NULL)
				goto fail;
			rest =
			    get_longlong(rest, &resp->r_length, REQUIRES_MORE,
					 "Invalid length");
			if (rest == NULL)
				goto fail;
			rest =
			    get_str(rest, resp->r_data, &dummy_len,
				    REQUIRES_NO_MORE);
			if (dummy_len != resp->r_length) {
				strcpy(errdetail, "Read length doesn't match");
				errno = EINVAL;
				sprintf(badtoken, "%lld != %lld", dummy_len,
					resp->r_length);
				goto fail;
			}
			break;
		}
		break;

	case STATUS_AVAILABLE:
	case STATUS_GRANTED:
	case STATUS_DENIED:
	case STATUS_DEADLOCK:
		rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
		if (rest == NULL)
			goto fail;
		if (resp->r_cmd != CMD_LIST) {
			rest = get_lock_type(rest, &resp->r_lock_type);
			if (rest == NULL)
				goto fail;
		}
		rest =
		    get_longlong(rest, &resp->r_start, REQUIRES_MORE,
				 "Invalid lock start");
		if (rest == NULL)
			goto fail;
		rest =
		    get_longlong(rest, &resp->r_length, REQUIRES_NO_MORE,
				 "Invalid lock length");
		break;

	case STATUS_CONFLICT:
		rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
		if (rest == NULL)
			goto fail;
		rest =
		    get_long(rest, &resp->r_pid, REQUIRES_MORE,
			     "Invalid conflict pid");
		if (rest == NULL)
			goto fail;
		rest = get_lock_type(rest, &resp->r_lock_type);
		if (rest == NULL)
			goto fail;
		rest =
		    get_longlong(rest, &resp->r_start, REQUIRES_MORE,
				 "Invalid lock start");
		if (rest == NULL)
			goto fail;
		rest =
		    get_longlong(rest, &resp->r_length, REQUIRES_NO_MORE,
				 "Invalid lock length");
		break;

	case STATUS_CANCELED:
		if (resp->r_cmd == CMD_LOCKW) {
			rest = get_fpos(rest, &resp->r_fpos, REQUIRES_MORE);
			if (rest == NULL)
				goto fail;
			rest = get_lock_type(rest, &resp->r_lock_type);
			if (rest == NULL)
				goto fail;
			rest =
			    get_longlong(rest, &resp->r_start, REQUIRES_MORE,
					 "Invalid lock start");
			if (rest == NULL)
				goto fail;
			rest =
			    get_longlong(rest, &resp->r_length,
					 REQUIRES_NO_MORE,
					 "Invalid lock length");
		} else if (resp->r_cmd == CMD_ALARM) {
			rest =
			    get_long(rest, &resp->r_secs, REQUIRES_NO_MORE,
				     "Invalid alarm time");
		} else {
		}
		break;

	case STATUS_COMPLETED:
		break;

	case STATUS_ERRNO:
		rest =
		    get_long(rest, &resp->r_errno, REQUIRES_MORE,
			     "Invalid errno");
		if (rest == NULL)
			goto fail;
		strncpy(resp->r_data, rest, MAXSTR);
		rest += strlen(rest);
		break;

	case STATUS_PARSE_ERROR:
		break;

	case STATUS_ERROR:
		break;
	}

	if (rest != NULL)
		return rest;

 fail:
	resp->r_status = STATUS_PARSE_ERROR;
	sprintf(resp->r_data, "%s %ld ERRNO %d \"%s\" \"%s\" bad token \"%s\"",
		commands[resp->r_cmd].cmd_name, resp->r_tag, errno,
		strerror(errno), errdetail, badtoken);
	resp->r_cmd = NUM_COMMANDS;
	return NULL;
}
Пример #6
0
void sprintf_resp(char *line, const char *lead, struct response *resp)
{
	char *rest = line;

	if (lead != NULL) {
		const char *name = "<NULL>";

		if (resp->r_client != NULL)
			name = resp->r_client->c_name;

		rest = rest + sprintf(line, "%s %s ", lead, name);
	}

	rest =
	    rest + sprintf(rest, "%ld %s %s", resp->r_tag,
			   commands[resp->r_cmd].cmd_name,
			   str_status(resp->r_status));

	switch (resp->r_status) {
	case STATUS_OK:
		switch (resp->r_cmd) {
		case CMD_COMMENT:
		case CMD_HELLO:
			sprintf(rest, " \"%s\"\n", resp->r_data);
			break;

		case CMD_LOCKW:
		case CMD_LOCK:
		case CMD_UNLOCK:
		case CMD_TEST:
		case CMD_LIST:
		case CMD_HOP:
		case CMD_UNHOP:
		case NUM_COMMANDS:
			sprintf(rest, " Unexpected Status\n");
			break;

		case CMD_ALARM:
			sprintf(rest, " %ld\n", resp->r_secs);
			break;

		case CMD_QUIT:
			sprintf(rest, "\n");
			break;

		case CMD_OPEN:
			sprintf(rest, " %ld %ld\n", resp->r_fpos, resp->r_fno);
			break;

		case CMD_CLOSE:
		case CMD_SEEK:
			sprintf(rest, " %ld\n", resp->r_fpos);
			break;

		case CMD_WRITE:
			sprintf(rest, " %ld %lld\n", resp->r_fpos,
				resp->r_length);
			break;

		case CMD_READ:
			sprintf(rest, " %ld %lld \"%s\"\n", resp->r_fpos,
				resp->r_length, resp->r_data);
			break;
		}
		break;

	case STATUS_AVAILABLE:
	case STATUS_GRANTED:
	case STATUS_DENIED:
	case STATUS_DEADLOCK:
		if (resp->r_cmd == CMD_LIST)
			sprintf(rest, " %ld %lld %lld\n", resp->r_fpos,
				resp->r_start, resp->r_length);
		else
			sprintf(rest, " %ld %s %lld %lld\n", resp->r_fpos,
				str_lock_type(resp->r_lock_type), resp->r_start,
				resp->r_length);
		break;

	case STATUS_CONFLICT:
		sprintf(rest, " %ld %ld %s %lld %lld\n", resp->r_fpos,
			resp->r_pid, str_lock_type(resp->r_lock_type),
			resp->r_start, resp->r_length);
		break;

	case STATUS_CANCELED:
		if (resp->r_cmd == CMD_LOCKW) {
			sprintf(rest, " %ld %s %lld %lld\n", resp->r_fpos,
				str_lock_type(resp->r_lock_type), resp->r_start,
				resp->r_length);
		} else if (resp->r_cmd == CMD_ALARM) {
			sprintf(rest, " %ld\n", resp->r_secs);
		} else {
		}
		break;

	case STATUS_COMPLETED:
		sprintf(rest, "\n");
		break;

	case STATUS_ERRNO:
		if (errno == 0)
			sprintf(rest, " %ld \"%s\"\n", resp->r_errno,
				errdetail);
		else
			sprintf(rest, " %ld \"%s\" \"%s\" bad token \"%s\"\n",
				resp->r_errno, strerror(resp->r_errno),
				errdetail, badtoken);
		break;

	case STATUS_PARSE_ERROR:
		break;

	case STATUS_ERROR:
		break;
	}
}
Пример #7
0
int compare_responses(struct response *expected, struct response *received)
{
	errno = 0;

	if (received == NULL) {
		strcpy(errdetail, "Unexpected NULL response");
		return false;
	}

	if (expected->r_client != received->r_client
	    && strcmp(expected->r_client->c_name,
		      received->r_client->c_name) != 0) {
		sprintf(errdetail, "Unexpected response from %s",
			received->r_client->c_name);
		return false;
	}

	if (expected->r_cmd != received->r_cmd) {
		sprintf(errdetail, "Unexpected command %s",
			commands[received->r_cmd].cmd_name);
		return false;
	}

	return_if_ne_long(expected->r_tag, received->r_tag, "Unexpected tag");

	if (expected->r_status != received->r_status) {
		sprintf(errdetail, "Unexpected status %s",
			str_status(received->r_status));
		return false;
	}

	switch (expected->r_status) {
	case STATUS_OK:
		switch (expected->r_cmd) {
		case CMD_COMMENT:
		case CMD_HELLO:
			/* could check string, but not worth it - HELLO has
			 * already set client name and that has been checked
			 */
			break;

		case CMD_LOCKW:
		case CMD_LOCK:
		case CMD_UNLOCK:
		case CMD_TEST:
		case CMD_LIST:
		case CMD_HOP:
		case CMD_UNHOP:
		case NUM_COMMANDS:
			sprintf(errdetail, "Unexpected Status %s for %s",
				str_status(received->r_status),
				commands[received->r_cmd].cmd_name);
			return false;

		case CMD_ALARM:
			return_if_ne_long(expected->r_secs, received->r_secs,
					  "Unexpected secs");
			break;

		case CMD_QUIT:
			break;

		case CMD_OPEN:
			return_if_ne_long(expected->r_fpos, received->r_fpos,
					  "Unexpected fpos");
			return_if_ne_long(expected->r_fno, received->r_fno,
					  "Unexpected file number");
			break;

		case CMD_CLOSE:
		case CMD_SEEK:
			return_if_ne_long(expected->r_fpos, received->r_fpos,
					  "Unexpected fpos");
			break;

		case CMD_WRITE:
			return_if_ne_long(expected->r_fpos, received->r_fpos,
					  "Unexpected fpos");
			return_if_ne_longlong(expected->r_length,
					      received->r_length,
					      "Unexpected length");
			break;

		case CMD_READ:
			return_if_ne_long(expected->r_fpos, received->r_fpos,
					  "Unexpected fpos");
			return_if_ne_longlong(expected->r_length,
					      received->r_length,
					      "Unexpected length");
			return_if_ne_string(expected->r_data, received->r_data,
					    "Unexpected data");
			break;
		}
		break;

	case STATUS_AVAILABLE:
	case STATUS_GRANTED:
	case STATUS_DENIED:
	case STATUS_DEADLOCK:
		return_if_ne_long(expected->r_fpos, received->r_fpos,
				  "Unexpected fpos");
		if (expected->r_cmd != CMD_LIST)
			return_if_ne_lock_type(expected->r_lock_type,
					       received->r_lock_type);
		return_if_ne_longlong(expected->r_start, received->r_start,
				      "Unexpected start");
		return_if_ne_longlong(expected->r_length, received->r_length,
				      "Unexpected length");
		break;

	case STATUS_CONFLICT:
		return_if_ne_long(expected->r_fpos, received->r_fpos,
				  "Unexpected fpos");
		return_if_ne_long(expected->r_pid, received->r_pid,
				  "Unexpected pid");
		return_if_ne_lock_type(expected->r_lock_type,
				       received->r_lock_type);
		return_if_ne_longlong(expected->r_start, received->r_start,
				      "Unexpected start");
		return_if_ne_longlong(expected->r_length, received->r_length,
				      "Unexpected length");
		break;

	case STATUS_CANCELED:
		if (expected->r_cmd == CMD_LOCKW) {
			return_if_ne_long(expected->r_fpos, received->r_fpos,
					  "Unexpected fpos");
			return_if_ne_lock_type(expected->r_lock_type,
					       received->r_lock_type);
			return_if_ne_longlong(expected->r_start,
					      received->r_start,
					      "Unexpected start");
			return_if_ne_longlong(expected->r_length,
					      received->r_length,
					      "Unexpected length");
		} else if (expected->r_cmd == CMD_ALARM) {
			return_if_ne_long(expected->r_secs, received->r_secs,
					  "Unexpected secs");
		} else {
		}
		break;

	case STATUS_COMPLETED:
		break;

	case STATUS_ERRNO:
		break;

	case STATUS_PARSE_ERROR:
		break;

	case STATUS_ERROR:
		break;
	}

	return true;
}