void jx_print_buffer( struct jx *j, buffer_t *b ) { if(!j) return; switch(j->type) { case JX_NULL: buffer_putstring(b,"null"); break; case JX_DOUBLE: buffer_printf(b,"%lg",j->double_value); break; case JX_BOOLEAN: buffer_printf(b,"%s",j->boolean_value ? "true" : "false"); break; case JX_INTEGER: buffer_printf(b,"%lld",(long long)j->integer_value); break; case JX_SYMBOL: buffer_printf(b,"%s",j->symbol_name); break; case JX_STRING: jx_escape_string(j->string_value,b); break; case JX_ARRAY: buffer_putstring(b,"["); jx_item_print(j->items,b); buffer_putstring(b,"]"); break; case JX_OBJECT: buffer_putstring(b,"{"); jx_pair_print(j->pairs,b); buffer_putstring(b,"}"); break; } }
/* * @brief reports device list * @param sc socket * @param channel * @param url command url * @param dev device handle * @param ssid session id * @ret -1 error, 0 success */ int novacom_hostcmd_devremove(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid) { int rc=-1; buffer_t *b = buffer_new(100); /* 44 + 44 + 2 */ device_handle_t dev = (device_handle_t)_dev; char *file = NULL; char hash[SHA1_HASH_STRSIZE]; if ( strlen(ssid) != NOVACOM_AUTHSESSION_LEN) { LTRACEF("invalid ssid length(%d)\n", strlen(ssid)); goto done; } /* buffer */ if (!b) goto done; /* expecting at least one parameter */ if (url->argcount < 1) { goto done; } /* message type(auth.h) */ rc = buffer_putbyte(b, SSH_MSG_USERAUTH_TOKENREQUEST_RM); if (rc) goto done; /* version info */ rc = buffer_putbyte(b, 0); if (rc) goto done; /* password info */ rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0])); if (rc) goto done; /* token hash info */ file = novacom_rnduid(dev); if (!file) goto done; rc = tokenstorage_readhash(file, ssid, hash, sizeof(hash)); if (-1 == rc) { LTRACEF("unable to get hashed token\n"); goto done; } /* pack it */ rc = buffer_putstring(b, (unsigned char *)hash, sizeof(hash)); if (rc) goto done; rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url); done: LTRACEF("rc(%d)\n", rc); platform_free(file); buffer_free(b); return rc; }
static void jx_pair_print( struct jx_pair *pair, buffer_t *b ) { if(!pair) return; jx_print_buffer(pair->key,b); buffer_putstring(b,":"); jx_print_buffer(pair->value,b); if(pair->next) { buffer_putstring(b,","); jx_pair_print(pair->next,b); } }
void jx_comprehension_print(struct jx_comprehension *comp, buffer_t *b) { if (!comp) return; buffer_putstring(b, " for "); buffer_putstring(b, comp->variable); buffer_putstring(b, " in "); jx_print_buffer(comp->elements, b); if (comp->condition) { buffer_putstring(b, " if "); jx_print_buffer(comp->condition, b); } jx_comprehension_print(comp->next, b); }
void jx_print_subexpr( struct jx *j, jx_operator_t parent, buffer_t *b ) { if(!j) return; int do_parens = 0; if(j->type==JX_OPERATOR && jx_operator_precedence(parent) < jx_operator_precedence(j->u.oper.type)) { do_parens = 1; } else { do_parens = 0; } if(do_parens) buffer_putstring(b,"("); jx_print_buffer(j,b); if(do_parens) buffer_putstring(b,")"); }
/* * Get a filename in cache for given md5sum. */ const char *filecache_getfilename(TARGET *t, MD5SUM sum, const char* extension) { BUFFER buff; size_t pos; const char *cachedir; const char* result; cachedir = filecache_getpath(t); /* if no cachedir, no cachefiles */ if (cachedir==NULL) { return NULL; } /* put the cachedir in front of buffer */ buffer_init(&buff); buffer_addstring(&buff, cachedir, strlen(cachedir)); buffer_addchar(&buff, '/'); pos = buffer_pos(&buff); buffer_addstring(&buff, "000/", 4); /* add use md5 as filename */ buffer_addstring(&buff, md5tostring(sum), 32); if (extension) buffer_addstring(&buff, extension, strlen(extension)); buffer_addchar(&buff, 0); buffer_setpos(&buff, pos); buffer_putstring(&buff, buffer_ptr(&buff) + pos + 4, 3); result = newstr(buffer_ptr(&buff)); buffer_free(&buff); return result; }
char *string_replace_percents( const char *str, const char *replace ) { /* Common case: do nothing if no percents. */ if(!strchr(str,'%')) return xxstrdup(str); buffer_t buffer; buffer_init(&buffer); const char *s; for(s=str;*s;s++) { if(*s=='%' && *(s+1)=='%' ) { if( *(s+2)=='%' && *(s+3)=='%') { buffer_putlstring(&buffer,"%%",2); s+=3; } else { buffer_putstring(&buffer,replace); s++; } } else { buffer_putlstring(&buffer,s,1); } } char *result; buffer_dup(&buffer,&result); buffer_free(&buffer); return result; }
/* * @brief handles device login * @param sc socket * @param channel * @param url command url * @param dev device handle * @param ssid session id * @param method 0 - password, 1 token * @ret -1 error, 0 success */ static int novacom_hostcmd_login(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid, int method) { int rc=-1; buffer_t *b = buffer_new(100); device_handle_t dev = (device_handle_t)_dev; /* buffer */ if (!b) goto done; /* expecting at least one parameter */ if (url->argcount < 1) { goto done; } /* message type(auth.h) */ rc = buffer_putbyte(b, SSH_MSG_USERAUTH_REQUEST); if (rc) goto done; /* version info */ rc = buffer_putbyte(b, 0); if (rc) goto done; /* method info: 0 password, 1 token */ if (method) rc = buffer_putstring(b, (const unsigned char *)AUTH_METHOD_TOKEN, AUTH_METHOD_TOKEN_LEN); else rc = buffer_putstring(b, (const unsigned char *)AUTH_METHOD_PASSWORD, AUTH_METHOD_PASSWORD_LEN); if (rc) goto done; /* hash info */ rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0])); if (rc) goto done; LTRACEF("channel %d, hash %s\n", channel, url->args[0]); rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url); done: buffer_free(b); return rc; }
void jx_escape_string( const char *s, buffer_t *b ) { if(!s) return; buffer_putstring(b,"\""); while(*s) { switch(*s) { case '\"': buffer_putstring(b,"\\\""); break; case '\'': buffer_putstring(b,"\\\'"); break; case '\\': buffer_putstring(b,"\\\\"); break; case '\b': buffer_putstring(b,"\\b"); break; case '\f': buffer_putstring(b,"\\f"); break; case '\n': buffer_putstring(b,"\\n"); break; case '\r': buffer_putstring(b,"\\r"); break; case '\t': buffer_putstring(b,"\\t"); break; default: if(isprint(*s)) { buffer_printf(b,"%c",*s); } else { buffer_printf(b,"\\u%04x",(int)*s); } break; } s++; } buffer_putstring(b,"\""); }
static void jx_item_print( struct jx_item *item, buffer_t *b ) { if(!item) return; jx_print_buffer(item->value,b); if(item->next) { buffer_putstring(b,","); jx_item_print(item->next,b); } }
static int find (buffer_t *B, const size_t base, buffer_t *path, const char *pattern, int recursive) { int rc = 0; DIR *D = opendir(buffer_tostring(path)); if (D) { struct dirent *entry; size_t current = buffer_pos(path); while ((entry = readdir(D))) { struct stat buf; if (buffer_putstring(path, entry->d_name) == -1) goto failure; /* N.B. We don't use FNM_PATHNAME, so `*.c' matches `foo/bar.c' */ if (fnmatch(pattern, buffer_tostring(path)+base, 0) == 0) { if (buffer_printf(B, "%s%c", buffer_tostring(path), 0) == -1) goto failure; /* NUL padded */ rc += 1; } if (recursive && strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..") && stat(buffer_tostring(path), &buf) == 0 && S_ISDIR(buf.st_mode)) { if (buffer_putliteral(path, "/") == -1) goto failure; int found = find(B, base, path, pattern, recursive); if (found == -1) goto failure; else if (found > 0) rc += found; } buffer_rewind(path, current); } } /* else skip */ goto out; failure: rc = -1; goto out; out: if (D) closedir(D); return rc; }
/* * @brief reports device list * @param sc socket * @param channel * @param url command url * @param dev device handle * @param ssid session id * @ret -1 error, 0 success */ static int novacom_hostcmd_devadd(SOCKET sc, uint32_t channel, novacom_command_url_t *url, void *_dev, const char *ssid) { int rc=-1; buffer_t *b = buffer_new(100); device_handle_t dev = (device_handle_t)_dev; /* buffer */ if (!b) goto done; /* expecting at least one parameter */ if (url->argcount < 1) { goto done; } /* message type(auth.h) */ rc = buffer_putbyte(b, SSH_MSG_USERAUTH_TOKENREQUEST_ADD); if (rc) goto done; /* version info */ rc = buffer_putbyte(b, 0); if (rc) goto done; /* password info */ rc = buffer_putstring(b, (const unsigned char *)url->args[0], strlen(url->args[0])); if (rc) goto done; rc = novacom_write_channel_async(dev, channel, b->data, b->pos, ASYNC_FLAG_COPY, (novacom_async_callback)&socketcmd_write_callback, (void *)url); done: buffer_free(b); return rc; }
void jx_print_buffer( struct jx *j, buffer_t *b ) { if(!j) return; switch(j->type) { case JX_NULL: buffer_putstring(b,"null"); break; case JX_DOUBLE: buffer_printf(b,"%g",j->u.double_value); break; case JX_BOOLEAN: buffer_printf(b,"%s",j->u.boolean_value ? "true" : "false"); break; case JX_INTEGER: buffer_printf(b,"%lld",(long long)j->u.integer_value); break; case JX_SYMBOL: buffer_printf(b,"%s",j->u.symbol_name); break; case JX_STRING: jx_escape_string(j->u.string_value,b); break; case JX_ARRAY: buffer_putstring(b,"["); jx_item_print(j->u.items,b); buffer_putstring(b,"]"); break; case JX_OBJECT: buffer_putstring(b,"{"); jx_pair_print(j->u.pairs,b); buffer_putstring(b,"}"); break; case JX_OPERATOR: jx_print_subexpr(j->u.oper.left,j->u.oper.type,b); buffer_putstring(b,jx_operator_string(j->u.oper.type)); jx_print_subexpr(j->u.oper.right,j->u.oper.type,b); if(j->u.oper.type==JX_OP_LOOKUP) buffer_putstring(b,"]"); break; case JX_FUNCTION: buffer_putstring(b, jx_function_name_to_string(j->u.func.function)); buffer_putstring(b, "("); jx_print_args(j->u.func.arguments, b); buffer_putstring(b, ")"); break; case JX_ERROR: buffer_putstring(b,"Error"); jx_print_buffer(j->u.err, b); break; } }