if ((mr_errcode = prefetch_value(q, argv, cl)) != MR_SUCCESS)
return mr_errcode;
+ /* If this is an UPDATE query, we're done. */
+ if (row == 2)
+ return MR_SUCCESS;
+
+ /* For an add query, we need to fill in the creator id. */
+ sprintf(argv[q->argc + q->vcnt + 1], "%d", cl->client_id);
return MR_SUCCESS;
}
WHERE mach_id = :id;
if (cnt > 0)
return MR_IN_USE;
+ EXEC SQL SELECT COUNT(member_id) INTO :cnt FROM imembers
+ WHERE member_type = 'MACHINE' and member_id = :id;
+ if (cnt > 0)
+ return MR_IN_USE;
EXEC SQL DELETE FROM mcmap WHERE mach_id = :id;
+ if (dbms_errno)
+ return mr_errcode;
+
+ EXEC SQL DELETE FROM mcntmap WHERE mach_id = :id;
if (dbms_errno)
return mr_errcode;
return MR_SUCCESS;
}
+/* setup_asnt - verify that the data entered for the subnet is sane.
+ * In particular, make sure that the "low" and "high" addresses are
+ * correctly ordered, i.e., high > low.
+ */
+
+int setup_asnt(struct query *q, char *argv[], client *cl)
+{
+ int high, low, row, status;
+ char *account_number;
+
+ /* Check for asnt or usnt. */
+ if (q->type == APPEND)
+ row = 0;
+ else
+ row = 1;
+
+ low = atoi(argv[row + 7]);
+ high = atoi(argv[row + 8]);
+ status = atoi(argv[row + 2]);
+ account_number = argv[row + 4];
+
+ /* Don't allow Private subnets to be created without a valid billing
+ * number.
+ */
+ if (status == SNET_STATUS_PRIVATE_10MBPS ||
+ status == SNET_STATUS_PRIVATE_100MBPS ||
+ status == SNET_STATUS_PRIVATE_1000MBPS)
+ {
+ EXEC SQL SELECT account_number FROM accountnumbers
+ WHERE account_number = :account_number;
+ if (sqlca.sqlcode == SQL_NO_MATCH)
+ return MR_ACCOUNT_NUMBER;
+ }
+
+ /* Special case 0.0.0.0 and 255.255.255.255 */
+ if (!(low == 0 || low == -1 || high == 0 || high == -1))
+ if (low > high)
+ return MR_ADDRESS;
+
+ /* If this is update_subnet, we're done. */
+ if (row == 1)
+ return MR_SUCCESS;
+
+ /* For an add_subnet query, allocate and fill in a new snet_id */
+ if ((mr_errcode = prefetch_value(q, argv, cl)) != MR_SUCCESS)
+ return mr_errcode;
+
+ return MR_SUCCESS;
+}
/* setup_dsnt - verify that the subnet is no longer being referenced
* and may safely be deleted.
static int badlistchars[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
- 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, /* SPACE - / */
+ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, /* SPACE - / */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /* 0 - ? */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* P - _ */
else if (!strcmp(q->shortname, "ulis"))
idx = 1;
name = argv[idx];
- desc = argv[10 + idx];
+
+ if (q->version == 2)
+ desc = argv[9 + idx];
+ else if (q->version == 3)
+ desc = argv[10 + idx];
+ else if (q->version >= 4)
+ desc = argv[12 + idx];
if (idx == 1)
{
if (cnt > 0)
return MR_IN_USE;
+ EXEC SQL SELECT count(name) INTO :cnt FROM containers
+ WHERE acl_id = :id AND acl_type = 'LIST';
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ EXEC SQL SELECT count(name) INTO :cnt FROM containers
+ WHERE memacl_id = :id AND memacl_type = 'LIST';
+ if (cnt > 0)
+ return MR_IN_USE;
+
return MR_SUCCESS;
}
int value, id, ssaddr, smask, shigh, slow, cnt;
unsigned int saddr, mask, high, low;
EXEC SQL END DECLARE SECTION;
- int row;
+ int row, idx;
struct in_addr addr;
id = *(int *)argv[0];
else
row = 0;
+ if (q->version < 6)
+ idx = 0;
+ else if (q->version >= 6 && q->version < 8)
+ idx = 1;
+ else
+ idx = 2;
+
/* Sanity check name, vendor, model, and os. */
if ((row == 0 || strcasecmp(argv[1], oldname)) &&
!hostname_check(argv[row]))
return MR_EXISTS;
/* check address */
- if (!strcmp(argv[9 + row], "unassigned"))
+ if (!strcmp(argv[9 + row + idx], "unassigned"))
value = -1;
- else if (!strcmp(argv[9 + row], "unique"))
+ else if (!strcmp(argv[9 + row + idx], "unique"))
{
- if (*(int *)argv[8 + row] == 0)
+ if (*(int *)argv[8 + row + idx] == 0)
value = -1;
else
value = -2;
}
else
{
- value = ntohl(inet_addr(argv[9 + row]));
+ value = ntohl(inet_addr(argv[9 + row + idx]));
if (value == -1)
return MR_ADDRESS;
}
/*
* an address or unique was specified.
*/
- id = *(int *)argv[8 + row];
+ id = *(int *)argv[8 + row + idx];
EXEC SQL SELECT saddr, mask, high, low INTO :ssaddr, :smask,
:shigh, :slow FROM subnet WHERE snet_id = :id;
if (dbms_errno)
* link in an inet_addr() that returns an error for
* this case.
*/
- addr.s_addr = inet_addr(argv[9 + row]);
+ addr.s_addr = inet_addr(argv[9 + row + idx]);
name = inet_ntoa(addr);
EXEC SQL SELECT count(mach_id) INTO :cnt FROM machine
WHERE address = :name;
* we have an address in value. Convert it to a string and store it.
*/
addr.s_addr = htonl(value);
- strcpy(argv[9 + row], inet_ntoa(addr));
+ strcpy(argv[9 + row + idx], inet_ntoa(addr));
}
else
- strcpy(argv[9 + row], "unassigned");
+ strcpy(argv[9 + row + idx], "unassigned");
/* status checking */
- value = atoi(argv[7 + row]);
+ value = atoi(argv[7 + row + idx]);
if (row == 0 && !(value == 1 || value == 0))
return MR_TYPE;
if (row == 1)
return MR_SUCCESS;
}
+int setup_dcon(struct query *q, char *argv[], client *cl)
+{
+ EXEC SQL BEGIN DECLARE SECTION;
+ int id, cnt;
+ char containername[CONTAINERS_NAME_SIZE];
+ EXEC SQL END DECLARE SECTION;
+
+ id = *(int *)argv[0];
+ /* check to see if there are machines in this container */
+ EXEC SQL SELECT COUNT(mach_id) INTO :cnt FROM mcntmap
+ WHERE cnt_id = :id;
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ /* check to see if there are subcontainers in this container */
+
+ /* get the container name */
+
+ EXEC SQL SELECT name INTO :containername
+ FROM containers
+ WHERE cnt_id = :id;
+
+ /* trim off the trailing spaces */
+ strcpy(containername, strtrim(containername));
+
+ EXEC SQL SELECT COUNT(cnt_id) INTO :cnt FROM containers
+ WHERE name LIKE :containername || '/' || '%';
+
+ if (cnt > 0)
+ return MR_IN_USE;
+
+ if (dbms_errno)
+ return mr_errcode;
+ return MR_SUCCESS;
+}
+
/* hostname_check()
* validate the rfc1035/rfc1123-ness of a hostname
*/